【问题标题】:Using Hibernate annotations to persist custom value for Enumerated attribute使用 Hibernate 注释来持久化枚举属性的自定义值
【发布时间】:2011-06-29 06:16:39
【问题描述】:

我有很多 Java 枚举,我坚持使用 Hibernate。据我所知,有两种不同的标准方法可以持久化这些枚举:

@Enumerated(EnumType.ORDINAL)

这是默认设置,它只是保留枚举中的序数值。

@Enumerated(EnumType.STRING)

这会保留枚举值的名称。

到目前为止,这些对我来说都很好,但是现在我有一个新的枚举,我想从枚举中保留一个既不是序数也不是名称的自定义值。这可能吗?我四处搜索,看到很多人在询问如何保留名称,这很容易使用 EnumType.STRING 完成,但我想保留一个可用于在我的 SQL 查询中进行比较的 int。我尝试覆盖 toString() 以返回我的自定义值,但这不起作用。

我将在下面粘贴我的 java 枚举。我想保留枚举中的 int 值成员。

提前致谢!

public enum Permission {
    VIEW (4),
    CHANGE(6),
    FULL(7);

    private int value;

    Permission(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

【问题讨论】:

    标签: java hibernate annotations


    【解决方案1】:

    您可以实现具有所需行为的UserType,并将Hibernate 配置为与@Type 注释一起使用。

    例如,请参阅UserType for persisting a Typesafe Enumeration with a VARCHAR column

    【讨论】:

    • 是的,但遗憾的是不能跨 JPA 实现移植。
    • 谢谢。仅休眠的解决方案对我来说很好,但我宁愿用注释来做。该示例使用映射文件。注释可以做同样的事情吗?如果有,怎么做?
    • @Ike:请注意答案第一段中的链接。
    • 好的,我现在明白了。谢谢!我最终选择了 Puce 建议的解决方法,因为它实现起来更简单,但我以后会记住这一点。
    【解决方案2】:

    是的,我也缺少 JPA 解决方案。

    解决方法:

      private int permissionValue;
      private transient Permission permission;
    

    然后在权限的getter/setter中进行转换。

    也许您还需要实现一些生命周期方法? (我不知道。) http://download.oracle.com/docs/cd/B32110_01/web.1013/b28221/undejbs003.htm#BABIAAGE

    【讨论】:

    • 谢谢。我试试看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 2011-01-10
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多