2013-06-13 41 views
0

我JPA實體是這樣的:地圖<String,字符串>使用JPA

@Entity 
@Table(name = "ATTRIBUTE") 
public class Attribute { 

    //ID stuff 

    @Column(name = "NAME", nullable = false) 
    private String name; 

    @Column(name = "VALUE", nullable = false) 
    private String value; 

    //getters and setters 
} 

而其他實體:

@Entity 
@Table(name = "ATTRIBUTE_GROUP") 
public class AttributeGroup { 

    //ID stuff 

    @ElementCollection(fetch = FetchType.LAZY, targetClass = java.lang.String.class) 
    @CollectionTable(name = "ATTRIBUTE") 
    @MapKeyColumn(name = "NAME") 
    @Column(name = "VALUE") 
    private Map<String, String> attributes = new HashMap<>(); 

    public void createAttribute(String name, String value) { 
     Attribute attribute = new Attribute(); 
     attribute.setName(name); 
     attribute.setValue(value); 
     attribute.setAttributeGroup(this); 
     attributes.put(name, value); 
    } 

    public Map<String, String> getAttributes() { 
     return attributes; 
    } 
} 

我必須AttributeGroup實體的映射裏面會有Attribute作爲一個關鍵字的價值和Attribute的價值。

目前的方法不適合我。當我試圖將記錄保存到數據庫時,它會生成異常,該事務僅標記爲回收。我不知道這是否是寫作方式,如果它不工作,顯然不是。

我該如何在JPA中實現這樣的地圖AttributeGroupAttribute構成名稱/值的配對對象?

我通過EntityManager使用Hibernate。

+0

強制使用hibernate註釋嗎?我們不能去尋找xml映射嗎? –

+0

是的,我需要堅持JPA方法,hibernate只是一個實現,因爲我們將來可能會遷移到OpenJPA。 – user2219247

+0

發佈異常的完整堆棧跟蹤以及導致異常的代碼。另外,Attribute實體的重點是什麼?你似乎沒有使用它。你在你的方法中創建一個新的屬性,但不要對它做任何事情。 –

回答

0

您不能將元素集合與另一個實體存儲在同一個表中,因爲名稱/值對不能同時是元素和實體。元素沒有標識,並且不會保留其他任何字段。

您可能會做的是將1:M或M:M轉換爲使用該名稱作爲映射關鍵字的屬性。然後,您可以直接將具有名稱/屬性對的地圖公開到應用程序,或者創建其他訪問器,將地圖轉換爲地圖(如果需要)。由於身份的原因,直接公開和使用Attribute可能是一個更好的主意。

如果這不符合要求,則可以通過元素集合使用字符串/字符串配對,但不能將相同的表格重用爲實體或其他元素集合映射。該表需要一個返回給AttributeGroup的外鍵以及名稱/值對的字段,這將在重用時導致問題。

相關問題