我有一个有三个值的枚举。它被用作实体bean中的属性。
这是bean中的属性:
@Enumerated(EnumType.ORDINAL)
private BillingMethod billingMethod;
这是枚举类:
public enum BillingMethod {
ONLINEBILL("enum.billingmethod.onlinebill"), // Should be 1, but is now 0 in the database
PAPERBILL("enum.billingmethod.paperbill"), // Should be 2, but is now 1 in the database
PRINT("enum.billingmethod.print"); // Should be 3, but is now 2 in the database
private String tag;
private BillingMethod(String tag){
this.tag = tag;
}
@Override
public String getTag() {
return tag;
}
}
有一个非常罕见的特定原因,我需要这些值为1,2,3。而不是数据库中通常的0,1,2。
不要担心这里的tag
,它用于从属性文件中获取String表示。
那么,如何将ORDINAL设置为从1开始而不是0?
答案 0 :(得分:3)
我看到两个选项:
最简单:将一个Integer映射为hibernate,在getter中对枚举进行解码:
@Column(...)
private Integer billingMethod;
public BillingMethod getBillingMethod() {
// add here better error handling (logging additional info
// to help diagnose array out of bound exceptions).
return BillingMethod.values()[billingMethod - 1];
}
// add a setter doing a similar thing
问题是如果不进行相同的编码/解码,使用hql或条件进行搜索将无法正常工作。不太好。
创建自定义UserType。 How to set up Datepicker VS 2013
中的更多信息然后以这种方式映射字段:
@Type("com.fully.qualified.class.name.of.MyUserType")
private BillingMethod billingMethod;
(在@Type
注释中使用用户类型的完全限定名称时,您不需要注册它)
实现起来有点复杂,但在标准枚举映射可行的每种情况下都能正常工作
答案 1 :(得分:1)
我遇到了同样的问题 - 看看这个解决方案,对我有用:
Better Enum Mapping with Hibernate
作者使用Hibernate-UserTypes来解决这个问题。我已经以相同的方式实现了它并且它有效!