java将数据库枚举实例字段值而不是枚举值持久化
例如,我有这样的枚举
public enum Season {
WINTER(1), SPRING(10), SUMMER(50), FALL(100);
private int expectedVisitors;
private Season(int expectedVisitors) {
this.expectedVisitors = expectedVisitors;
}
public int printExpectedVisitors() {
return expectedVisitors;
}
}
季节是一种将存储在数据库中的字段类型
@Column(name = "season")`
@Enumerated(EnumType.STRING)
private Season season;
但是我需要存储int 1/10/100,而不是value Winter。我该写什么?有可能做这样的事吗
# 1 楼答案
对于纯JPA解决方案(无hibernate绑定),您必须能够访问JPA 2.1及其新的转换器功能,如下所述:
https://www.thoughts-on-java.org/jpa-21-type-converter-better-way-to/
# 2 楼答案
这可以通过使用自定义用户类型来实现,我们已经做了很多
关于这方面有很多教程,例如,这里有一个快速的谷歌搜索结果:http://www.gabiaxel.com/2011/01/better-enum-mapping-with-hibernate.html
不过,有一件事您可能希望做得有所不同:您可以使用包信息,而不是在每个枚举上使用
@Type
。java在某个包中(我们使用的是定义用户类型的包),并对包进行如下注释:您的实体将只包含以下内容:
关于枚举的最后一个想法是:看起来您希望将
expectedVisitors
写入数据库,并在读取时使用它将该数字映射回枚举值。虽然这将与用户类型的工作,我会认为,一个设计缺陷,因为游客人数可能不是一个安全的标识符一个赛季(并且它可以改变任何方式,所以它可能不应该是一个硬编码根本)。p># 3 楼答案
您可以简单地将季节存储为整数:
并使用枚举生成getter和setter:
当季节发生变化时: