休眠多对多关系集或列表?

2022-09-01 11:24:53

我在我的Java豆上有很多很多的关系。当我使用我的变量定义如下时: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

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


答案 1

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

使用 也对性能有很大的影响。当使用时,Hibernate使用具有一些可怕特征的下面的集合。即:如果您添加新关系,它将首先删除所有现有关系,然后将它们插入回您的新关系。有了它,只需插入新记录。SetListPersistentBagSet

第三件事 - 你不能在一个实体中有多个s,因为你会变得臭名昭著,不能同时获取多个袋子例外。List

另请参阅:


答案 2

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