Mappage d'énumération à chaîne en veille prolongée

92

J'ai un modèle Category Hibernate:

@Entity
@Table(name = "category")
public class Category {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "id")
    private long id;

    @Column(name = "type")
    private String type;

qui ont un champ de type chaîne. J'ai également une énumération Java qui représente un type de catégorie:

public enum CategoryType {
    INCOME, OUTCOME;
}

que je voudrais utiliser à la place du type de chaîne. Le SQL accepte deux valeurs distinctes dans le paramètre varchar: soit CategoryIncomeou CategoryOutcome. Je voudrais que la classe de modèle de catégorie accepte une variable enum - et la mappe d'une manière ou d'une autre à la chaîne chaque fois que hibernate le demande.

C'est possible?

ducine
la source

Réponses:

182

Oui, c'est possible. Ça devrait être:

@Enumerated(EnumType.STRING)
@Column(name = "category_type")
private CategoryType categoryType;
dcernahoschi
la source
15
Vous pouvez même aller plus loin et, maintenant que JPA 2.1 est sorti, utilisez@Converter(autoApply = true) public class CategoryTypeConverter implements javax.persistence.AttributeConverter <CategoryType, String>
membersound
6
Pour toute personne qui pourrait avoir le même problème ..: je devais mettre cette annotation à ma méthode de lecture à la place du champ, comme ceci: @Enumerated(EnumType.STRING) public CategoryType getCategoryType() { return this.categoryType; }.
ZeroOne
J'étais en hibernate.ddl-auto=updatemode et j'ai dû abandonner ma table et laisser hibernate la créer à nouveau afin de convertir mon enum de int en varchar. Espérons que cela aide quelqu'un avec un problème similaire.
Arashsoft
Voir stackoverflow.com/questions/44864675/… si votre valeur d'énumération est écrite en tant qu'ordinal malgré l'annotation énumérée.
metamaker
Je ne le mets pas sur le getter. Le mettre sur la déclaration de variable fonctionne très bien, ce qui est bon pour Lombok en utilisant @Data, etc. Que faire si je veux appliquer cela à tous les Enums sans annoter chacun d'eux?
Andrew le