我正在学习Hibernate,其中集合用于hibernate。我知道集合中的包用于映射Collection或list类型的属性。袋子和清单之间的区别是袋子没有重复允许的收集类型,并且在列表中我们维护收集中的插入顺序。
1 GT;但除此之外,这两者之间还有其他区别吗?
2 - ;我读了一本书,
bag是缺少要用作元素键的对象 包,在更新或删除时会降低性能 元素。当包的一个元素发生变化时,Hibernate必须更新 因为Hibernate无法找到所有元素 哪个元素已更改
有人对此有任何想法吗?
答案 0 :(得分:1)
您的定义是正确的。 Bag的工作方式类似于没有索引的列表(您不知道元素的顺序是什么),因此它与Set with duplicatelicates类似。
最重要的是要知道,如果您不在一对多关系中使用索引列,Hibernate可以隐式地将您的集合映射为包。这可能会降低删除/更新语句的性能,并且了解这一点很有用。
您可以在此处找到内部工作方式: http://assarconsulting.blogspot.co.uk/2009/08/why-hibernate-does-delete-all-then-re.html
答案 1 :(得分:0)
当您不想要列表的插入订单功能但想要允许重复值时,您可以去包。在这里你不能去设置,因为它不允许重复值。
答案 2 :(得分:0)
a)BAG
只想补充一点。有两种类型的袋子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>();
另请注意,虽然在表的单独列中保留了排序。当你获取它时,它不会出现在对象状态中。因此,它仅用于内部操作。