2012-03-01 99 views
1

這裏是我的代碼的精簡版本:JPA2:我們可以在實體中使用多個@ElementCollection嗎?

@Entity 
public class Item implements Serializable{ 

@Id 
@GeneratedValue 
private long id; 

@ElementCollection(fetch=FetchType.EAGER ,targetClass=Cost.class) 
@CollectionTable(name="ItemCost", joinColumns = {@JoinColumn(name="itemId")}) 
private Set<Cost> costs= new HashSet<Cost>(); 

@ElementCollection(fetch=FetchType.EAGER ,targetClass=ItemLocation.class) 
@CollectionTable(name="ItemLocation", joinColumns = {@JoinColumn(name="itemId")}) 
private Set<ItemLocation> itemLocations; 

} 

允許在上面的代碼?我有兩個可嵌入類Cost和ItemLocation,與@ElementCollection一起使用。

問題: 當我試圖運行一個名爲查詢

@NamedQuery(name = "Item.findAll", query = "SELECT i FROM Item i") 

我有奇怪的行爲。第二個元素集合(ItemLccation表)中的記錄正在翻倍(插入到表中)。

回答

0

說到JPA 2.0,您的代碼是允許的。擁有多個使用ElementCollection進行註釋的集合是完全合法的。此外,它很可能與您遇到的問題無關。順便說一句,爲了找出真的是你的問題,你是否在沒有收集成本的情況下嘗試了你的代碼?

第一次在這個集合中重複出現哪一點?如果ItemLocation沒有定義等於&哈希碼,則重複項可能很容易出現,因爲您自己添加項目。

可能你正面臨這個問題:Primary keys in CollectionTable和chancing類型列表並添加@OrderColumn將有所幫助。

+0

謝謝我沒有添加任何數據到成本集合嘗試,我仍然有位置的問題。所以我的問題與多元素集合無關。當我試圖查詢該項目時,我得到重複項。對於每次查找,它都會將項目位置中的記錄加倍。我不理解您對equals和hashcode的評論。 ItemLocation沒有Id,因爲它是Embeddable。對於我正在使用的@GeneratedId – 2012-03-02 18:06:35

+0

添加@OrderColumn已經解決了這個問題。雖然我不明白關於equals和hashcode的建議。你能否用一個例子來說明一個沒有主鍵的Embeddable類的含義?謝謝你的幫助。 – 2012-03-02 20:20:20

相關問題