Est-il possible d'écrire un générique enum convertisseur pour JPA?

Je voulais écrire un Convertisseur de JPA qui stocke toutes les enum, en MAJUSCULES. Certaines énumérations que nous rencontrons ne suivent pas encore la convention à utiliser uniquement des lettres Majuscules donc, jusqu'à ce qu'ils sont refait j'ai toujours stocker la valeur future.

Ce que j'ai obtenu jusqu'à présent:

package student;

public enum StudentState {

    Started,
    Mentoring,
    Repeating,
    STUPID,
    GENIUS;
}

Je veux "Commencé" à être stockées sous forme de "commencer" et ainsi de suite.

package student;

import jpa.EnumUppercaseConverter;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

@Entity
@Table(name = "STUDENTS")
public class Student implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long mId;

    @Column(name = "LAST_NAME", length = 35)
    private String mLastName;

    @Column(name = "FIRST_NAME", nullable = false, length = 35)
    private String mFirstName;

    @Column(name = "BIRTH_DATE", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date mBirthDate;

    @Column(name = "STUDENT_STATE")
    @Enumerated(EnumType.STRING)
    @Convert(converter = EnumUppercaseConverter.class)
    private StudentState studentState;

}

le convertisseur actuellement ressemble à ceci:

package jpa;


import javax.persistence.AttributeConverter;
import java.util.EnumSet;

public class EnumUppercaseConverter<E extends Enum<E>> implements AttributeConverter<E, String> {

    private Class<E> enumClass;

    @Override
    public String convertToDatabaseColumn(E e) {
        return e.name().toUpperCase();
    }

    @Override
    public E convertToEntityAttribute(String s) {
        //which enum is it?
        for (E en : EnumSet.allOf(enumClass)) {
            if (en.name().equalsIgnoreCase(s)) {
                return en;
            }
        }
        return null;
    }

}

ce qui ne va pas, c'est que je ne sais pas ce que enumClass sera au moment de l'exécution. Et je ne pouvais pas trouver un moyen de transmettre cette information à l'convertisseur dans le @Convertisseur annotation.

Donc est-il possible d'ajouter des paramètres à la converter ou tricher un peu? Ou est-il un autre moyen?

Je suis en utilisant EclipseLink 2.4.2

Merci!

  • Attention, c'est fragile, surtout parce qu'il est parfaitement légal pour un enum pour avoir des valeurs AVALUE et AValue.
  • oui c'est vrai, mais je définir comme completement interdite 😀
InformationsquelleAutor wemu | 2014-05-09