Hibernate多对多关系集或列表?

时间:2011-11-17 21:36:07

标签: java hibernate spring list set

我的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(因为列表可能有重复和设置,但性能和其他问题怎么样)?

3 个答案:

答案 0 :(得分:58)

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

使用Set也会带来很好的性能影响。使用List时,Hibernate会使用下面的PersistentBag集合,其中包含一些可怕的特征。即:如果你添加一个新的关系,它将首先删除所有现有的关系,然后将它们插回+你的新关系。使用Set,只需插入新记录。

第三件事 - 你不能在一个实体中拥有多个List,因为你会臭名昭着无法同时获取多个行李例外。

另见:

答案 1 :(得分:3)

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

答案 2 :(得分:0)

我知道这个问题是在几年前提出的,但是我想就这个话题发表评论,以防万一有人怀疑集合与列表问题。

关于惰性获取,我认为 bag (不带索引的列表)将是更好的选择,因为这样的事实是,您避免在每次添加对象时都检索所有对象到集合中:

  • 如果您使用的是
  • ,请确保新添加的内容是唯一的
  • 保留订单,以防您使用列表(带有索引)

如果我弄错了,请纠正我。