2017-06-14 2 views
0

J'ai la colonne 'gender' en tant que VARCHAR (1)/CHAR. Comment analyser les valeurs « M »/« F » java enum avec des valeurs (mâle, femelle) de la classe @Entity sans utiliserHibernate char colonne à enum

@Column(name="gender") 
private Character cGender; 

et le convertir manuellement pour objet ENUM?

Répondre

1

Vous devez fournir votre propre convertisseur:

@Convert(converter = GenderConverter.class) 
@Column(name="gender") 
private Gender gender; 

Ensuite, mettre en œuvre

public class GenderConverter implements AttributeConverter<Gender, Character> { 
    @Override 
    public Character convertToDatabaseColumn(Gender from) { 

     Character value = 'm'; 

     if (from == Gender.FEMALE) { 
      value = 'f'; 
     } 

     return value; 
    } 

    @Override 
    public Gender convertToEntityAttribute(Character to) { 
     Gender g = Gender.MALE; 
     if ('f' == to) 
      g = Gender.FEMALE; 
     } 
     return g; 
    } 
} 
+0

oui, vous avez raison, la façon dont je propose n'enregistre que l'enum et non la valeur. –

+1

Il est également possible d'ajouter @Converter (autoApply = true) sur la classe de recouvrement et après cela, Hibernate convertira automatiquement tous les champs de genre (pas besoin de @Convert (converter = GenderConverter.class)). –

+0

@NikolayYashchenko intéressant! Je pense que vous devriez poster ceci comme réponse alternative, puisque je n'étais pas familier avec cela –

0

Pour ENUM, vous pouvez utiliser le type ENUM au lieu d'utiliser le type de caractères, par exemple:

@Enumerated(EnumType.STRING) 
@Column(name = "GENDER") 
private Gender gender; 
+0

Alors j'obtiendrai une exception: La valeur inconnue de nom [M] pour enum class [network.models.Gender]. Parce que la valeur de la colonne n'est pas un nom complet d'enum, ceci est juste 1 char M/F. –

+0

oui, vous devriez utiliser comme @Alexey Soshin a écrit en fournissant votre propre convertisseur. –

0

En plus de la réponse de @Alexey Soshin: Aussi, il est possible d'ajouter @Converter (aut oApply = true) sur la classe de couverture et après que Hibernate convertira tous les champs de genre automatiquement (pas besoin de @Convert (converter = GenderConverter.class)).