2017-06-14 172 views
0

我有列'gender'作爲VARCHAR(1)/ CHAR。 如何與@Entity類別值(男,女)解析,而無需使用休眠字符列來枚舉

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

,並手動將其轉換爲枚舉對象值「M」 /「F」到Java枚舉?

回答

1

您需要提供自己的轉換器:

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

然後實現它

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

是的,你說得對,我建議的方式只會記錄枚舉而不是值。 –

+1

也可以在coverter類中添加@Converter(autoApply = true),然後Hibernate會自動轉換所有Gender字段(不需要@Convert(converter = GenderConverter.class))。 –

+0

@NikolayYashchenko有趣!我想你應該發佈這個作爲替代答案,因爲我不熟悉那 –

0

,枚舉,您可以使用枚舉類型,而不是使用字符類型,例如:

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

然後我會得到一個異常:枚舉類[network.models.Gender]的未知名稱值[M]。因爲列值不是枚舉的全名,所以這只是1個字符M/F。 –

+0

是的,你應該使用@Alexey Soshin寫的提供你自己的轉換器。 –

0

除了@Alexey Soshin的回答: 也可以添加@Converter(aut oApply = true),然後Hibernate會自動轉換所有Gender字段(不需要@Convert(converter = GenderConverter.class))。