<bag>和<list> </list> </bag>之间的基本区别

时间:2014-04-02 10:28:23

标签: java hibernate

我正在学习Hibernate,其中集合用于hibernate。我知道集合中的包用于映射Collection或list类型的属性。袋子和清单之间的区别是袋子没有重复允许的收集类型,并且在列表中我们维护收集中的插入顺序。
1 GT;但除此之外,这两者之间还有其他区别吗? 2 - ;我读了一本书,

  

bag是缺少要用作元素键的对象   包,在更新或删除时会降低性能   元素。当包的一个元素发生变化时,Hibernate必须更新   因为Hibernate无法找到所有元素   哪个元素已更改

有人对此有任何想法吗?

3 个答案:

答案 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>();

另请注意,虽然在表的单独列中保留了排序。当你获取它时,它不会出现在对象状态中。因此,它仅用于内部操作。