我正在学习Hibernate,在hibernate中使用集合。我知道集合中的袋子用于映射集合或列表类型的属性。此外,还区别于袋子和列表是袋子无序的重复允许的集合类型,在列表中我们保持插入顺序在集合。
1>,除了这个,这两者还有什么区别吗?
2>,我在一本书里读到,
bag是指缺少对象作为包中元素的键,这降低了更新或删除元素的性能。当包中的元素发生变化时,Hibernate必须更新所有元素,因为Hibernate无法确定哪些元素已更改。
有人知道这件事吗?
发布于 2014-04-02 11:27:43
你的定义是正确的。包就像没有索引的列表(您不知道元素的顺序),所以它类似于使用重复设置。
最重要的是要知道,如果在一对多的关系中不使用索引列,Hibernate可以隐式地将您的集合映射为一个包。这可能会降低delete/update语句的性能,了解这一点是很好的。
在这里您可以发现它是如何内部工作的:http://assarconsulting.blogspot.co.uk/2009/08/why-hibernate-does-delete-all-then-re.html
发布于 2016-05-17 11:42:05
当您不希望列表的插入顺序功能,但希望允许重复的值,那么您可以选择袋子。在这里,您不能使用set,因为它不允许重复值。
发布于 2017-12-24 20:54:25
a)袋
只想再加一点。有两种类型的袋子:1)没有身份证的袋子和2)带身份证的袋子。
在没有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>();因此,如果你正在使用袋,总是尝试使用身份证袋,除非你有充分的理由使用另一个。
b)列表列表也有两种类型,有顺序的列表和没有顺序的列表。
没有订单的列表类似于没有ids的袋子。
@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>();另外,请注意,尽管排序在表的单独列中持久化。当您获取时,它不会出现在对象状态上。因此,它只是用于内部操作。
https://stackoverflow.com/questions/22808566
复制相似问题