Java 保留数据库枚举实例字段值而不是枚举值
例如,我有这样的枚举Java 保留数据库枚举实例字段值而不是枚举值,java,hibernate,enums,spring-data,Java,Hibernate,Enums,Spring Data,例如,我有这样的枚举 public enum Season { WINTER(1), SPRING(10), SUMMER(50), FALL(100); private int expectedVisitors; private Season(int expectedVisitors) { this.expectedVisitors = expectedVisitors; } public int printExpectedVisitors() { retu
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。我该写什么?有可能做这样的事情吗?这可以通过使用自定义用户类型来完成,我们已经做了很多了 关于这方面有很多教程,例如,这里有一个快速谷歌搜索得到的教程: 但有一件事您可能希望做得有所不同:您可以在某些包中使用package-info.java(我们使用的是定义用户类型的包),而不是在每个枚举上使用
@Type
,并对包进行如下注释:
@TypeDefs( {
@TypeDef( name = "SeasonUserType", typeClass = SeasonUserType.class, defaultForType = Season.class )
})
package your.package;
//a few imports here
您的实体将只包含以下内容:
@Column(name = "season")
private Season season;
关于枚举的最后一个想法是:看起来您希望将
expectedVisitors
写入数据库,并在读取时使用它将该数字映射回枚举值。虽然这将与用户类型一起工作,但我认为,由于访问者数量的设计缺陷可能不是一个季节的安全标识符(并且它可以改变任何方式,所以它可能不应该是一个硬编码根本)。这可以通过使用自定义用户类型来完成,我们做了很多。
关于这方面有很多教程,例如,这里有一个快速谷歌搜索得到的教程:
但有一件事您可能希望做得有所不同:您可以在某些包中使用package-info.java(我们使用的是定义用户类型的包),而不是在每个枚举上使用@Type
,并对包进行如下注释:
@TypeDefs( {
@TypeDef( name = "SeasonUserType", typeClass = SeasonUserType.class, defaultForType = Season.class )
})
package your.package;
//a few imports here
您的实体将只包含以下内容:
@Column(name = "season")
private Season season;
关于枚举的最后一个想法是:看起来您希望将expectedVisitors
写入数据库,并在读取时使用它将该数字映射回枚举值。虽然这将与用户类型一起工作,但我认为一个设计缺陷,因为访问者的数量可能不是一个安全的标识符一个季节(并且它可以改变任何方式,所以它可能不应该是一个硬编码根本)。< /P> < P>对于一个纯粹的JPA解决方案(没有Hibernate绑定),你必须有机会访问JPA 2.1及其新的转换器特性,如下文所述:
对于纯JPA解决方案(无hibernate绑定),您必须能够访问JPA 2.1及其新的转换器功能,如下所述:
您只需将季节存储为整数即可:
@Column(name = "season")
private Integer season;
并使用枚举生成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;
}
您可以简单地将季节存储为整数:
@Column(name = "season")
private Integer season;
并使用枚举生成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;
}
可能是我以前遇到过的类似的事情。只要记住,如果这些值可能发生变化,会发生什么。您想要哪些值?例如:如果在2012年秋季,期望值为50,您希望该值返回为50,还是希望显示100(当前期望值)?这不是当时的预期。您可能希望使用enum作为setter,但如果不希望更改,则为持久性和getter提供int。如果您使用enum,并且值发生更改,那么如果您尝试返回到enum,则在提取旧数据时会遇到问题。可能与我以前遇到的类似情况重复。只要记住,如果这些值可能发生变化,会发生什么。您想要哪些值?例如:如果在2012年秋季,期望值为50,您希望该值返回为50,还是希望显示100(当前期望值)?这不是当时的预期。您可能希望使用enum作为setter,但如果不希望更改,则为持久性和getter提供int。如果您使用enum,并且值发生更改,那么如果您尝试返回到enum,则在提取旧数据时会遇到问题。