JPA:仅更新映射表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JPA:仅更新映射表相关的知识,希望对你有一定的参考价值。

我有一个Project和Employee实体,它们具有如下所示的ManyToMany关系。

@Entity
public class Project {
     @Id @GeneratedValue
     private int projectId;

     private String projectName;

     // has some additional columns

     @ManyToMany(mappedBy = "projects")
     private List<Employee> emp = new ArrayList<Employee> ();
     ....
     .....

 }


 @Entity
public class Employee {
     @Id @GeneratedValue
     private int id;
     private String firstName;
     private String lastName;

     @ManyToMany(cascade=CascadeType.ALL)
     List<Project> projects = new ArrayList<Project> ();

     ....
     ....
}

当我使用上述实体时,JPA如下所示创建一个mpping表'Employee_Project'。

create table Employee_Project (emp_id integer not null, projects_projectId integer not null)

我的问题是,每当添加新员工时,我都只想更新employee表和Employee_Project映射表,并假设我知道要将该员工映射到的项目ID。 (不涉及项目表/实体,我的意思是为什么我应该提供完整的项目对象,而仅保存员工实体,如何通过jpa做到这一点?)

答案

您不需要提供整个Project对象。使用EntityManager.getReference(projectId)JpaRepository.getOne(projectId)

这些方法将创建具有适当ID的代理对象,而不是从数据存储区加载整个Project实体。

编辑您的服务方法应类似于以下内容:

@Transactional
public void createEmployee(Employee employee, Long projectId) {
    employee.setProjects(List.of(projectRepository.getOne(projectId));
    employeeRepository.save(employee);
}

[作为附带说明,CascadeType.ALL(特别是因为它包括CascadeType.MERGECascadeType.REMOVE)对@ManyToMany没有意义。除非您打算通过创建Project来创建Employee,否则CascadeType.PERSIST也没有意义。

以上是关于JPA:仅更新映射表的主要内容,如果未能解决你的问题,请参考以下文章

jpa 实体bean中如何定义非映射字段

JPA,如何使用同一个类(实体)来映射不同的表?

JPA 对象关系映射总结---persistence.xml 文件配置要点

JPA:仅更新特定字段

JPA:仅更新特定字段

修剪 JPA 中的映射列