【问题标题】:Implementing enum based dictionary in JPA 2在 JPA 2 中实现基于枚举的字典
【发布时间】:2012-01-01 09:55:43
【问题描述】:

假设我的应用程序中使用了字典(即性别:MALE、FEMALE)。

我希望将此字典用作 Java enum。此外,这个字典值是从一堆其他表中引用的,所以你希望它有一个单独的表

Java enum 本身不能是实体。我可以在我的实体类中使用enum 属性(注释为@Enumerated),但这会将枚举(作为整数、字符或字符串)保存在使用此enum每个 表中而不是对字典表使用 FK。

您将如何实现这样的用例?
- 使用产生enum 值的静态方法创建Dictionary 实体?
- 修改了 Dictionary 的 getter 和 setter,它返回 enum 而不是 Dictionary 实例?
- ...或者也许您从来不需要将enum 保存在单独的表中?

【问题讨论】:

    标签: java dictionary enums jpa-2.0


    【解决方案1】:

    您可以使用与enum 的序号匹配的整数 ID 值来定义字典表。正如许多人所指出的那样,这很脆弱,因为您无法轻松修改您的值:当在您的 @Enumerated 注释上使用 EnumType.ORDINAL 修饰符时,JPA 依赖于 ordinal() 方法。

    稍微好一点,您可以指定EnumType.STRING,并将字典表的主键列定义为VARCHAR,其值等于enum 的值名称。这仍然很脆弱,因为您不能再更改您的 enum 名称。

    answer for this question 显示了另一种选择:在实体中使用整数,但在访问器中进行翻译。

    【讨论】:

      【解决方案2】:

      这可以通过这种方法实现。

      1.枚举您可以存储 ID 的位置

      public enum Gender{
       MALE(1L),
       FEMALE(2L);
      
      private final Long id;
      
      Gender(Long id) {
         this.id= id;
      }
      
      public Long getId(){
         return id;
      }
      

      2。与此枚举相关的单独实体

      public class RefGenderEntity {
          private Long id;
          private String value;
          ......
      }
      

      3。看看EntityManager#findById

      MyObjectThatStoreIdForGender val = ...... ;
      RefGenderEntity gender = em.find(RefGenderEntity.class, val.getGenderId());
      

      当然 RefGenderEntity 表现在可以预先填充两个值,并且您可以使用外键和常规正常工作连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-04
        • 1970-01-01
        • 2020-02-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-22
        • 2020-02-24
        相关资源
        最近更新 更多