2011-11-18 118 views
6

假设我在我的应用程序中使用了字典(即gender:MALE,FEMALE)。在JPA中实现基于枚举的字典2

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

Java enum不能是一个实体本身。我可以在我的实体类中使用enum属性(注释为@Enumerated),但这将使用此enum而不是将FK用于字典表中的枚举(作为Integer,char或String)中的每个表。

你将如何实现这样的用例?
- 用静态方法创建一个Dictionary实体,生成enum值?
- Dictionary修改后的获取器和设置器返回enum而不是Dictionary实例?
- ...或者你可能从来没有需要在一个单独的表中保留enum

回答

0

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

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

answer for this question显示了另一个选项:在您的实体中粘贴整数,但在您的存取器中进行翻译。

0

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

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表现在可以预先填充两个值,并且您可以使用外键和常规正常工作联接。