2012-03-01 69 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

相关问题