2011-07-07 128 views
1

我想用Hibernate映射LinkedHashMap(註解驅動)。如何用Hibernate映射LinkedHashMap?

我知道屬性@MapKey和@IndexColumn,但我可以同時使用基本字符串映射linkedhashmap嗎?

請不要給我一個解決方案,我必須將寵物外化到一個類,並使用寵物列表而不是LinkedHashMap(我知道如何做,但我顯然不想這樣做)。

我的課:

@Entity 
public class Person 
{ 
    private LinkedHashMap<String, String> pets; 

    // map definition ? 
    // id of the pet > name of the pet 
    public LinkedHashMap<String, String> getPets() 
    { 
     return pets; 
    } 

    ... 
} 

回答

3

您可以使用@Lob註釋:(從數據庫中讀取時和反序列化)的LinkedHashMap的將被序列化,並存儲在BLOB列。

但這當然是脆弱的,不可能查詢,強制使用Java來讀取寵物的內容。

如果您需要一個更傳統的映射到一個額外的Pet表,並且有一對多關聯,那麼您將需要一個Pet實體。

+0

是有一些問題,當我改變由於serialVersionUID的Java版本?因爲我不能通過更改java版本來釋放數據。 –

+2

您可能希望未來的版本將保持向後兼容,但更改Java實現肯定會破壞它。我不會指望它。您可能想要使用可以序列化爲XML或JSON的自定義類型,但我會使用映射到表的實體:更加標準,高效,可查詢且易於維護。 –

+0

好的,謝謝。很高興知道;) –

1

您可以使用@ElementCollection註釋來映射基本類型的地圖。應該像

@ElementCollection(fetch=FetchType.EAGER) 
    @CollectionTable(name = "person_pets", joinColumns = @JoinColumn(name = "person_id")) 
    @MapKeyColumn(name = "name") 
    @OrderColumn(name = "name") 
    @Column(name = "pet") 
    private Map<String, String> pets = new LinkedHashMap<String, String>(); 
+0

這不是一個好的解決方案,因爲您只映射經典的散列表,並且我想要按順序映射LinkedHashMap。 –

+0

你說得對。我們可以嘗試@OrderColumn,但是我找不到任何證據表明這個註釋可以與Map一起使用。 (更新了這個例子) – Trader001

1

在此只是stubled因爲我想學習Hibernate的(第3版)

我做了這樣的事情進行排序在數據庫方面: 不能映射一個LinkedHasMap直接傳遞給Hibernate,因爲它不是一個集合,而是一個集合的實現。

你可以做這樣的事情:

@ElementCollection 
@JoinTable(name = "PERSON_PET", joinColumns = @JoinColumn(name = "PERSON_ID")) 
@MapKeyColumn(name = "PET_KEY") 
@Column(name = "PET_NAME") 
@OrderBy(clause = "lower(PET_NAME) asc") 
private Map<String, String> pets = new LinkedHashMap<String, String>(); 

報價從Java Persistence with Hibernate

您可以通過收集表的任何列的順序。在內部,Hibernate使用一個 LinkedHashMap,它是保留關鍵元素的插入順序的映射的變體。 換句話說,在加載集合期間,Hibernate用於將元素添加到 集合的順序是您在 應用程序中看到的迭代順序。同樣可以用一個集合完成:Hibernate內部使用一個 LinkedHashSet。在您的Java類,屬性是常規設置/ HashSet的,但 Hibernate的一個LinkedHashSet內部包裹再次啓用了 order-by屬性