java - hibernate 多对多关系集或列表?

标签 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 (因为列表可能有重复和设置,但那又如何呢?性能和其他问题)?

最佳答案

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

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

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

另见:

关于java - hibernate 多对多关系集或列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8174667/

相关文章:

java - Spring、Hibernate、JUnit 带注释的实体

java - java编程中方法的声明

Spring 4 STOMP over Websockets - 如何正确设置登录名和密码

java - 分享意向安卓

java - 在构造函数中处理 JDialog

java - 使用 hibernate3 和 struts2

java - 线程 "main"javax.persistence.PersistenceException : No Persistence provider for EntityManager named lanceurApplication 中出现异常

java - 无法在 Eclipse Photon 上安装 Spring Tools 4 (Spring Tool Suite 4) - 不兼容

java - 快速 Swing 问题 : Need to shut down my database on close

java - 如果 CloudSim Plus 过载,如何添加多个虚拟机?