Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA CascadeType.PERSIST是如何工作的?_Java_Jpa - Fatal编程技术网

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);
}