2011-11-18 30 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表現在可以預先填充兩個值,並且您可以使用外鍵和常規正常工作聯接。