例如我有这样的枚举
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。我写的是什么shpuld?是否可以做这样的事情?
答案 0 :(得分:3)
这可以通过使用自定义用户类型来完成,我们已经做了很多。
有很多关于此的教程,例如:这是一个快速谷歌搜索提出的问题:http://www.gabiaxel.com/2011/01/better-enum-mapping-with-hibernate.html
您可能希望以不同的方式做一件事:不是在每个枚举上使用@Type
,而是可以在某个包中使用package-info.java(我们正在使用包中的定义了usertypes)并注释包,如下所示:
@TypeDefs( {
@TypeDef( name = "SeasonUserType", typeClass = SeasonUserType.class, defaultForType = Season.class )
})
package your.package;
//a few imports here
您的实体将只包含此内容:
@Column(name = "season")
private Season season;
对枚举的最后一个想法:看起来你想要将expectedVisitors
写入数据库并使用它在读取时将该数字映射回枚举值。虽然这可以与usertype一起使用我认为设计缺陷,因为访问者的数量可能不是一个季节的安全标识符(它可能会改变,所以它可能不应该是硬编码在所有)。
答案 1 :(得分:1)
您可以简单地将季节存储为整数:
@Column(name = "season")
private Integer season;
使用Enums制作getter和setter:
public Season getSeason() {
return Season.byValue(this.season);
}
public void setSeason(Season season) {
this.season = season == null ? null : season.getValue();
}
赛季的地方:
public Integer getValue() {
return this.expectedVisitors;
}
public Season byValue(int value) {
for (Season s : Season.values()) {
if (s.getValue() == value) {
return s;
}
}
return null;
}
答案 2 :(得分:0)
对于纯JPA解决方案(没有hibernate绑定),您必须能够访问JPA 2.1及其新的转换器功能,如下所述:
https://www.thoughts-on-java.org/jpa-21-type-converter-better-way-to/