2015-02-10 54 views
0

在我當前的spring項目中,我正在尋找一種方法來映射類似於我實體之一的字段:將一個實體中的java.util.Map與休眠映射

私有Map屬性;

其中鍵的類型應該是代表語言的雙字符字符串,值的類型應該是一個長度大約爲128Kb的字符串。

這個問題,我應該能夠使用像這樣的店鋪數據,這個屬性在我的數據庫:

<select name="..." multiple="multiple"> 
    <option value="..."> ... </option> 
</select> 

<textarea name="..."> ... </textarea> 

其中選擇我選擇一種語言,並輸入textarea的我插入所選語言中的文本。

在我看來,用百里香實施,我想閱讀與用戶語言相關的文本。

任何人都可以告訴我,如果有使用Hibernate的方法來映射這種od字段嗎?

回答

1
@OneToMany 
private Map<String, String> attribute; 

添加@MapKeyColumn和/或@Column如果你的列名不匹配JPA的默認值。爲您的地圖使用泛型(Map<String, String>),因此您不必手動指定類型。

3

你可以做什麼duckstep建議,但如果你想更好的粒度控制映射表的謊言你可以使用下面的註釋。

@ElementCollection(fetch=FetchType.EAGER) 
@CollectionTable(name = "FOO_TABLE", joinColumns = @JoinColumn(name = "fooId")) 
@MapKeyColumn(name="mapKey") 
@Column(name = "mapValue") 
private Map<String, String> fooMap = new HashMap<String, String>(); 

這意味着FOO_TABLE將有4列。作爲主鍵的ID列,mapKeyvarchar(255)),mapValuevarchar(255))和fooId作爲外鍵。

應用到地圖的註釋做以下事情:

@ElementCollection(fetch=FetchType.EAGER) - 告訴Hibernate,你必須元素(字符串的)的集合,而這些元素應該總是被預先抓取。如果你不想讓你的地圖爲空,就應用這個。另一方面,如果提取地圖是一個昂貴的查詢,或者地圖將變得特別大,並且您並不總是需要它,請改爲設置FetchType.LAZY。 (請參閱here深入瞭解EAGER與LAZY讀取的想法)

@CollectionTable - 告訴Hibernate您的集合值存儲在表中。表名由name參數指定,FK列使用@JoinColumn註釋指定。

@MapKeyColumn - 指向包含映射鍵值的列。

@Column - 指向包含地圖值的值的列。

如果需要,您可以輕鬆更改@MapKeyColumn@Column的值。

請注意,如果您發現您沒有在地圖中返回不同的值,請嘗試將@Fetch(FetchMode.SUBSELECT)添加到該集合中。這表明Hibernate應該選擇映射值而不是嘗試將它們連接到父項。

+0

可以請你看看這個問題http://stackoverflow.com/questions/41697714/hibernate-persist-mapstring-string-without-referencing-another-tables? – 2017-01-17 13:07:50