JPA CascadeType.PERSIST如何工作?

Zaw*_* oo 15 java jpa

在我的例子,Employee有一个OneToOne以关系DepartmentCascadeType.PERSIST.当我坚持多次Employee,


为什么EntityManager持续Department记录所有Employee记录?


我的期望是,如果我们使用CascadeType.PERSIST,当一个Employee被持久化时,Department将为每个Employee记录重新创建一条记录.

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;

    -----
}
Run Code Online (Sandbox Code Playgroud)

Department.java

@Entity
public class Department implements Serializable {
    private String id;
    private String name;
}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

结果:

Employee Table          Department Table
=================       ==============================
ID  Name  DEP_ID        ID      NAME    
=================       ==============================
1   EMP1    1           1       Test Department
2   EMP2    1
3   EMP3    1
4   EMP4    1
5   EMP5    1
6   EMP6    1
7   EMP7    1
8   EMP8    1
9   EMP9    1
10  EMP10   1   
Run Code Online (Sandbox Code Playgroud)

Jam*_*mes 13

JPA维护对象标识,不会保留现有对象.

将代码更改为正确,

for(int i=1; i <= 10; i++) {
    Department department = new Department("Test Department");
    Employee e = new Employee("EMP" + i, department);
    em.persist(e);
}
Run Code Online (Sandbox Code Playgroud)

  • 有关"JPA CascadeType.PERSIST如何工作?"的问题的答案将会很有趣.因为这是我查看问题的原因. (19认同)
  • CascadeType.PERSIST只是用于持久化方法的级联.如果删除或合并父实体,则不会触及相关的子实体. (3认同)