【问题标题】:Hibernate Many to Many Relations Set Or List?休眠多对多关系集或列表?
【发布时间】:2011-12-31 18:13:30
【问题描述】:

我的 Java bean 有多对多的关系。当我使用List 来定义我的变量时:

@Entity
@Table(name="ScD")
public class Group extends Nameable {

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
    @JoinColumn(name="b_fk")
    private List<R> r;
    //or
    private Set<R> r;

我得到了那个错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0'
...

当我使用Set 时,一切似乎都运行良好。

我想问一下,当使用多对多关系时,逻辑概念ListSet 使用哪一个(因为列表可能有重复和设置但性能和其他问题呢)?

【问题讨论】:

    标签: java hibernate spring list set


    【解决方案1】:

    我知道这个问题是几年前提出的,但我想对这个话题发表评论,以防有人对 set vs list 问题持怀疑态度。

    关于 延迟获取,我认为 bag(不带索引的列表)会是更好的选择,因为您可以避免每次添加对象时都检索所有对象收藏到:

    • 确保新添加的一个是唯一的,以防您使用 set
    • 保留顺序,以防您使用列表(带索引)

    如果我错了,请纠正我。

    【讨论】:

      【解决方案2】:

      Set 的唯一性要求如何?这是否会强制 Hibernate 每次将一个对象添加到集合中时检索所有对象以确保新添加的对象是唯一的? List 不会有这个限制。

      【讨论】:

      • List也有这个限制,因为hibernate需要在Lists中保存顺序,所以还要检索所有的item
      【解决方案3】:

      从关系数据库的角度来看,这是一个集合。数据库不保留顺序,使用 List 毫无意义,其中的顺序未指定(除非使用所谓的索引集合)。

      使用Set 也有很大的性能影响。当使用List 时,Hibernate 在下面使用PersistentBag 集合,该集合具有一些可怕的特性。即:如果您添加一个新关系,它将首先删除所有现有关系,然后将它们插入回来+您的新关系。使用Set 它只是插入新记录。

      第三件事 - 你不能在一个实体中拥有多个 Lists,因为你会遇到臭名昭著的无法同时获取多个包异常。

      另见:

      【讨论】:

      • 除了多对多关系(一对一、多对一、一对多)之外,我是否也应该使用Set 而不是List 以获得良好的设计模式?
      • 是的,因为List 建议物品已订购,但事实并非如此。我知道,我知道它的 API 稍微简单一些。
      • 都投票接受作为详细信息和良好链接的答案。
      • 我想问只是为了更清楚。当我在使用带有索引列的 List 时仅删除一个元素时,确实只删除了一个(如 Set)或全部删除并插入除已删除元素之外的所有元素?
      • 如果您使用 indexed 集合(索引列),则只会发生单个 DELETE。我认为第二个链接对此有很好的解释。
      猜你喜欢
      • 2015-12-22
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      相关资源
      最近更新 更多