保留数据库枚举实例字段值而不是枚举值

时间:2017-08-23 10:30:03

标签: 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() {
    return expectedVisitors;
  }
} 

和季节是一种存储在数据库中的文件。

@Column(name = "season")`
@Enumerated(EnumType.STRING)
private Season season;

但不是价值冬天我需要存储int 1/10/100。我写的是什么shpuld?是否可以做这样的事情?

3 个答案:

答案 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/