我正在学习Hibernate,其中集合用于休眠。我知道集合中的包用于映射Collection或list类型的属性。并且包和列表之间的差异是包与重复允许的收集类型无序,并且在列表中我们维护收集中的插入顺序。 1>但除此之外,这两者之间还有其他区别吗? 2>我读了一本书,
bag是缺少要用作包中元素的键的对象,这会在更新或删除元素时降低性能。当包的一个元素发生变化时,Hibernate必须更新所有元素,因为Hibernate无法找出哪个元素发生了变化
有没有人对此有任何想法?
你的定义是正确的。 Bag的工作方式类似于没有索引的列表(您不知道元素的顺序是什么),因此它类似于Set with duplicatelicates。
最重要的是要知道如果不在一对多关系中使用索引列,Hibernate可以隐式地将您的集合映射为包。这可能会降低删除/更新语句的性能,最好注意这一点。
在这里你可以找到它在内部如何工作:http://assarconsulting.blogspot.co.uk/2009/08/why-hibernate-does-delete-all-then-re.html
当您不想要列表的插入顺序功能但想要允许重复值时,您可以去包。在这里你不能去设置因为它不允许重复值。
一个包
只想补充一点。有两种类型的袋子1)没有id的袋子和2)带有Id的袋子。
当你删除任何元素时,在没有Id的包中,整个包被清除并且元素再次被插入。
但是在带有Id的包中,仅删除了已删除的元素,其余元素不会受到影响。
@ElementCollection
@CollectionTable(name = "account_user",joinColumns=@JoinColumn(name="user_id"))
@CollectionId(columns = { @Column(name = "account_user_id") }, generator = "sequence", type = @Type(type = "long"))
@Column(name = "account_provider")
private Collection<String> accountSet = new ArrayList<String>();
因此,如果您正在使用包,除非您有充分的理由使用另一个包,否则请务必使用ID包。
b)列表清单也有两种类型,即订单列表和无订单。
没有订单的列表类似于没有ID的包。
@ElementCollection
@CollectionTable(name = "account_user",joinColumns=@JoinColumn(name="user_id"))
@Column(name = "account_provider")
private List<String> accountSet = new ArrayList<String>();
在带有顺序的列表中,数据结构维护索引顺序。所以,如果你删除其中一个元素。其余的元素自动转移。
因此,这种类型的列表用于维护元素插入列表的顺序。
@ElementCollection
@OrderColumn(name="account_provider_order")
@CollectionTable(name = "account_user",joinColumns=@JoinColumn(name="user_id"))
@Column(name = "account_provider")
private List<String> accountSet = new ArrayList<String>();
另请注意,尽管在表的单独列中保留了排序。当你获取它时,它不会出现在对象状态中。因此,它仅用于内部操作。