Hibernate有多对多关系集或列表?

我的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; //or private Set r; 

我收到了这个错误:

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

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

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

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

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

第三件事 – 你不能在一个实体中拥有多个List ,因为你会得到臭名昭着的不能同时获取多个包的例外。

也可以看看:

  • 19.5。 了解收集性能

  • 为什么Hibernate会“删除所有然后重新插入” – 它不是那么奇怪

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