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.MERGE
和CascadeType.REMOVE
)对@ManyToMany
没有意义。除非您打算通过创建Project
来创建Employee
,否则CascadeType.PERSIST
也没有意义。
以上是关于JPA:仅更新映射表的主要内容,如果未能解决你的问题,请参考以下文章