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

JPA更新双向关联

轩辕啸
2023-03-14
问题内容

假设我们具有以下实体:

    @Entity
    public class Department {

        @OneToMany(mappedBy="department")
        private List<Employee> employees;
    }

    @Entity
    public class Employee {

        @ManyToOne
        private Department department
    }

在更新中可以理解,我们需要保持双方的关系如下:

Employee emp = new Employee();
Department dep = new Department();
emp.setDepartment(dep);
dep.getEmployees().add(emp);

到目前为止一切都很好。问题是,我是否应按以下所述在双方上进行合并,并且避免使用级联进行第二次合并?

entityManager.merge(emp);
entityManager.merge(dep);

还是合并拥有者足够?这些合并是否还应该在Transaction或EJB内部进行?还是在具有分离实体的简单控制器方法上完成它?


问题答案:

问题是,我是否应按以下所述在双方上进行合并,并且避免使用级联进行第二次合并?

您可以使用级联注释元素将操作的效果传播到关联的实体。级联功能最常用于父子关系中。

如果已使用元素值或注释对这些关系进行了注释,则该merge操作将级联到Department该关系所引用的实体。cascade``cascade=MERGE``cascade=ALL

受管实体之间的双向关系将根据(Employee)该关系拥有方所拥有的引用来保留。当它们更改时,开发人员有责任使在内存中拥有的引用和在内存中(Employee)相反的引用(Department)彼此保持一致。因此,通过以下一系列语句,该关系将通过单个语句同步到数据库merge

Employee emp = new Employee();
Department dep = new Department();
emp.setDepartment(dep);
dep.getEmployees().add(emp);
...
entityManager.merge(dep);

这些更改将在事务提交时传播到数据库。通过使用EntityManager#flush方法,在事务处于活动状态时,实体的内存状态也可以在其他时间同步到数据库。



 类似资料:
  • 我试图在用户和地址之间建立双向关系, 用户1-------->*地址 但是 地址1-------->1个用户 我在上网时得到了这些信息 > 对于一对一双向关系,拥有方对应于包含对应外键的方 双向关系的反向侧必须通过使用OneToOne、 OneToMany或ManyToMany批注的mappedBy元素来引用其 所属侧。mappedBy元素指定作为 关系所有者的实体中的属性或字段。 但如果我按照情

  • 服务 我的主要方法 所以在这里,当我尝试在students表中添加学生时,它给出了一个错误,错误是Falling

  • 嗨,我正在学习Spring JPA使用OneToMany和ManyToOne双向关系,在一些示例中,我看到OneToMany和ManyToOne关系,当我在两个方面编写时,JPA添加一个新列作为外键列,并插入父表中的键值。但当我尝试我的时候,这一栏总是空白的。下面是我的代码的样子: 下面是我的Account.java模型: 下面是我的dealer.java模型: 这里是我的控制器: 然后将JSON

  • 问题内容: 单向关联和双向关联有什么区别? 由于在数据库中生成的表都是相同的,所以我发现的唯一区别是双向关联的每一侧都有一个引用,而单向则没有。 这是单向关联 双向关联 区别在于该组是否持有用户的参考。 所以我想知道这是否是唯一的区别?哪个推荐? 问题答案: 主要区别在于,双向关系提供了双向导航访问,因此您无需显式查询即可访问另一侧。此外,它还允许您在两个方向上应用级联选项。 请注意,导航访问并不

  • 问题内容: 在JPA注释参考的示例部分中: 示例1-59 @OneToMany-具有泛型的客户类 示例1-60 @ManyToOne-具有泛型的Order类 在我看来,实体是协会的所有者。但是,在同一文档中对属性的说明中写道: 如果关系是双向的,则将关联的反(非所有权)侧的maptedBy元素设置为拥有该关系的字段或属性的名称,如示例1-60所示。 但是,如果我没有记错,则在示例中看起来,实际上是

  • 我正试图将一对多关联映射到一个实体,该实体是用映射的,但是当我的应用程序加载时,我遇到了一个验证异常: 内部异常:异常[EclipseLink-7250](Eclipse Persistence Services 2.5.2.v20140319-9AD6ABD):org.Eclipse.Persistence.exceptions.ValidationException异常 描述:[class m