将Ordinal Enum值设置为从1而不是0开始

时间:2016-12-30 18:55:06

标签: java hibernate jpa enums ordinal

我有一个有三个值的枚举。它被用作实体bean中的属性。

这是bean中的属性:

@Enumerated(EnumType.ORDINAL)
private BillingMethod billingMethod;

这是枚举类:

public enum BillingMethod  {
    ONLINEBILL("enum.billingmethod.onlinebill"), // Should be 1, but is now 0 in the database
    PAPERBILL("enum.billingmethod.paperbill"), // Should be 2, but is now 1 in the database
    PRINT("enum.billingmethod.print"); // Should be 3, but is now 2 in the database

    private String tag;

    private BillingMethod(String tag){
        this.tag = tag;
    }

    @Override
    public String getTag() {
        return tag;
    }
}

有一个非常罕见的特定原因,我需要这些值为1,2,3。而不是数据库中通常的0,1,2。

不要担心这里的tag,它用于从属性文件中获取String表示。

那么,如何将ORDINAL设置为从1开始而不是0?

2 个答案:

答案 0 :(得分:3)

我看到两个选项:

  1. 最简单:将一个Integer映射为hibernate,在getter中对枚举进行解码:

    @Column(...)
    private Integer billingMethod;
    
    public BillingMethod getBillingMethod() {
         // add here better error handling (logging additional info
         // to help diagnose array out of bound exceptions).
         return BillingMethod.values()[billingMethod - 1];
    }
    
    // add a setter doing a similar thing
    

    问题是如果不进行相同的编码/解码,使用hql或条件进行搜索将无法正常工作。不太好。

  2. 创建自定义UserType。 How to set up Datepicker VS 2013

    中的更多信息

    然后以这种方式映射字段:

    @Type("com.fully.qualified.class.name.of.MyUserType")
    private BillingMethod billingMethod;
    

    (在@Type注释中使用用户类型的完全限定名称时,您不需要注册它)

    实现起来有点复杂,但在标准枚举映射可行的每种情况下都能正常工作

答案 1 :(得分:1)

我遇到了同样的问题 - 看看这个解决方案,对我有用:

Better Enum Mapping with Hibernate

作者使用Hibernate-UserTypes来解决这个问题。我已经以相同的方式实现了它并且它有效!