基本区别 和

问题描述 投票:2回答:3

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

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

有没有人对此有任何想法?

java hibernate
3个回答
1
投票

你的定义是正确的。 Bag的工作方式类似于没有索引的列表(您不知道元素的顺序是什么),因此它类似于Set with duplicatelicates。

最重要的是要知道如果不在一对多关系中使用索引列,Hibernate可以隐式地将您的集合映射为包。这可能会降低删除/更新语句的性能,最好注意这一点。

在这里你可以找到它在内部如何工作:http://assarconsulting.blogspot.co.uk/2009/08/why-hibernate-does-delete-all-then-re.html


0
投票

当您不想要列表的插入顺序功能但想要允许重复值时,您可以去包。在这里你不能去设置因为它不允许重复值。


0
投票

一个包

只想补充一点。有两种类型的袋子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>();

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

© www.soinside.com 2019 - 2024. All rights reserved.