一尘不染

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

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

我得到那个错误:

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

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

我想问的是,在使用多对多关系时,哪一个关系用于逻辑概念ListSet(因为列表可能有重复项和集合,但是性能和其他问题又如何)?


阅读 182

收藏
2020-06-20

共1个答案

一尘不染

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

使用a Set也具有很大的性能影响。List使用Hibernate
时,PersistentBag在下面使用具有某些可怕特征的集合。即:如果您添加新关系,它将首先删除所有现有关系,然后再将其重新插入并添加新关系。使用Set它仅插入新记录。

第三件事- List在一个实体中不能有多个,因为您将声名狼藉 ,无法同时获取多个bag 异常。

也可以看看:

2020-06-20