有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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。我该写什么?有可能做这样的事吗


共 (3) 个答案

  1. # 2 楼答案

    这可以通过使用自定义用户类型来实现,我们已经做了很多

    关于这方面有很多教程,例如,这里有一个快速的谷歌搜索结果:http://www.gabiaxel.com/2011/01/better-enum-mapping-with-hibernate.html

    不过,有一件事您可能希望做得有所不同:您可以使用包信息,而不是在每个枚举上使用@Type。java在某个包中(我们使用的是定义用户类型的包),并对包进行如下注释:

    @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>

  2. # 3 楼答案

    您可以简单地将季节存储为整数:

    @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;
    }