sar*_*_pc 26 java enums hibernate jpa
Hibernate提供了@Enumerated
注释,它支持Enum
使用ORDINAL
或支持两种类型的映射STRING
.当我们使用map时EnumType.STRING
,它采用的是"名称",Enum
而不是toString()
Enum 的表示.在数据库列仅包含一个字符的情况下,这是一个问题.例如,我有以下枚举:
public enum Status{
OPEN{
@Override
public String toString(){
return "O";}
},
WAITLIST{
@Override
public String toString(){
return "W";}
},
COMPLETE{
@Override
public String toString(){
return "C";}
}
}
Run Code Online (Sandbox Code Playgroud)
当我坚持枚举Status.OPEN
使用@Enumerated(EnumType.STRING)
,即Hibernate试图在数据库中存储的值是开放的.但是,我的数据库列只包含一个字符,因此会引发异常.
克服这个问题的一个办法是改变枚举类型持有单个字符(如STATUS.O
,STATUS.W
代替STATUS.OPEN
,STATUS.WAITLIST
).但是,这降低了可读性.有关保持可读性以及将Enum映射到单个字符列的建议吗?
谢谢.
Ond*_*zek 14
最好自定义枚举映射是使用AttributeConverter
ie:
@Entity
public class Person {
...
@Basic
@Convert( converter=GenderConverter.class )
public Gender gender;
}
public enum Gender {
MALE( 'M' ),
FEMALE( 'F' );
private final char code;
private Gender(char code) {
this.code = code;
}
public char getCode() {
return code;
}
public static Gender fromCode(char code) {
if ( code == 'M' || code == 'm' ) {
return MALE;
}
if ( code == 'F' || code == 'f' ) {
return FEMALE;
}
throw ...
}
}
@Converter
public class GenderConverter
implements AttributeConverter<Gender, Character> {
public Character convertToDatabaseColumn(Gender value) {
if ( value == null ) {
return null;
}
return value.getCode();
}
public Gender convertToEntityAttribute(Character value) {
if ( value == null ) {
return null;
}
return Gender.fromCode( value );
}
}
Run Code Online (Sandbox Code Playgroud)
你可以在Hibernate docs中找到它:http: //docs.jboss.org/hibernate/orm/5.0/mappingGuide/en-US/html_single/#d5e678
查看这两篇文章 - http://community.jboss.org/wiki/Java5EnumUserType和http://community.jboss.org/wiki/UserTypeforpersistingaTypesafeEnumerationwithaVARCHARcolumn
他们通过自定义UserType解决问题.
小智 -5
public enum Status
{
OPEN("O"),
WAITLIST("W"),
COMPLETE("C")
private String description;
private Status(String description)
{
this.description = description;
}
public String getDescription()
{
return description;
}
}
and then when you read it:
Status.OPEN.getDescription()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
29738 次 |
最近记录: |