Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 保留数据库枚举实例字段值而不是枚举值_Java_Hibernate_Enums_Spring Data - Fatal编程技术网

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,则在提取旧数据时会遇到问题。