当前位置: 首页 > 面试题库 >

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

诸葛雨泽
2023-03-14
问题内容

我的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(因为列表可能有重复项和集合,但是性能和其他问题又如何)?


问题答案:

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

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

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

也可以看看:

  • 19.5。了解馆藏表现

  • 为什么Hibernate会“先删除所有内容然后重新插入”-并不奇怪



 类似资料:
  • 问题内容: 我有实体类A和C。它们正在映射表tblA和tblC,并且它们之间具有多对多关系,而tblB则在它们之间进行映射。tblB包含A_ID,C_ID和SetDate,最后一个是它的设置日期,因此是关系的属性。我的问题是,如何最好地映射此属性?目前,它们尚未映射,如下所示: A: C: 我应该如何从中获取tblB.SetDate? 干杯 尼克 问题答案: 据我所知, 不可能 以这种方式进行映射

  • 问题内容: 我有两个与多对多关联的表。 —数据库片段: 加载 ID 名称 会话 ID 日期 sessionsloads LoadId 的SessionID —hibernate映射片段: 为了从关联表 sessionloads中 删除一个条目,我执行以下代码: 但是,启动后,此代码将保持不变。 删除关联的正确方法是什么? 问题答案: 您需要更新和之间的链接的两端: 实际上,许多开发人员使用防御性方

  • 问题内容: 问题 首先,我想知道我的数据库结构很糟糕,但是目前我无法更改它。 话虽这么说,我需要在Hibernate(4.2.1)中创建一对多的双向关系,该关系不涉及主键(关系的“父”侧仅包含唯一键)并且不涉及联接表。表示这种关系的外键是从“子”到“父”的反向指针(请参见下文)。我已经搜索并尝试了各种不同的注释配置,但是没有运气。我要的是可能的吗? 数据库 GLOBAL_PART PART_REL

  • 问题内容: 我在Hibernate参考书的第21章中有一个基本的一对多关系父母/子女。 级联仅从子级到父级(持久级联仅是因为删除子级后我不希望删除父级)。 当我向父级添加一个子级并保存该子级时,我有一个TransientObjectException … 但是在saveOrUpdate上,我有以下异常: 我真的不明白,因为拯救孩子应该通过级联来拯救父母……有什么想法吗? 更新1 该问题似乎与“ o

  • 问题内容: 我有两个非常简单的对象,并且一个对象应在一组“一对多”关系中包含另一个对象。对象已正确插入数据库中,但是“子项”表中的外键始终为“ null”。 我不知道为什么: 这是测试对象,它将子对象保持在其集合中: 这是子对象,它包含指向“ TestObj”的反向链接: 我使用以下代码来持久化此对象: 有人可以解释一下为什么会这样吗? 问题答案: 这很简单:您永远不会初始化中的字段(应将其命名为

  • 问题内容: 我有两个非常简单的对象,并且一个对象应在一组“一对多”关系中包含另一个对象。对象已正确插入数据库中,但“子项”表中的外键始终为“ null”。 我不知道为什么: 这是测试对象,它将子对象固定在其集合中: 这是子对象,它包含指向“ TestObj”的反向链接: 我用下面的代码坚持这个对象: 有人可以解释一下为什么会这样吗? 问题答案: 这很简单:您永远不会初始化中的字段(应将其命名为Ch