Java JPA CascadeType.PERSIST是如何工作的?
在我的示例中,Java JPA CascadeType.PERSIST是如何工作的?,java,jpa,Java,Jpa,在我的示例中,Employee与Department具有CascadeType.PERSIST的OneToOne关系。 当我保留多个员工时 为什么EntityManager为所有员工记录保留单个部门记录 我的期望是,如果我们使用CascadeType.PERSIST,当员工被持久化时,将为每个员工记录重新创建一个部门记录 Employee.java @Entity public class Employee { private String id; private Strin
Employee
与Department
具有CascadeType.PERSIST的OneToOne
关系。
当我保留多个员工时
为什么EntityManager
为所有员工
记录保留单个部门
记录
我的期望是,如果我们使用CascadeType.PERSIST
,当员工
被持久化时,将为每个员工
记录重新创建一个部门
记录
Employee.java
@Entity
public class Employee {
private String id;
private String name;
@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "DEP_ID", referencedColumnName = "ID")
private Department department;
-----
}
Department.java
@Entity
public class Department implements Serializable {
private String id;
private String name;
}
Test.java
public void insert() {
em = emf.createEntityManager();
em.getTransaction().begin();
Department department = new Department("Test Department");
for(int i=1; i <= 10; i++) {
Employee e = new Employee("EMP" + i, department);
em.persist(e);
}
em.getTransaction().commit();
em.close();
}
JPA维护对象标识,不会保留现有对象
将代码更改为正确
for(int i=1; i <= 10; i++) {
Department department = new Department("Test Department");
Employee e = new Employee("EMP" + i, department);
em.persist(e);
}
for(int i=1;我是的,我知道,您的编码会起作用。您为所有员工创建了部门
的新实例。我的理解有什么错?因为您有员工到部门的一对一映射,而不是多对一映射。同时获得关于“JPA CascadeType.PERSIST是如何工作的?”。因为这就是我查看问题的原因。CascadeType.PERSIST只是针对PERSIST方法进行级联。如果删除或合并父实体,则不会触及相关子实体。我希望由于OneToOne注释,DEP_ID将具有唯一约束(就像OneToName关联的联接表的多面有一个唯一的约束一样)。有人能解释为什么在这种情况下,尽管有OneToOne注释,DEP_ID没有唯一的约束吗?
for(int i=1; i <= 10; i++) {
Department department = new Department("Test Department");
Employee e = new Employee("EMP" + i, department);
em.persist(e);
}