JPA CascadeType.PERSIST如何工作? [英] How does the JPA CascadeType.PERSIST work ?

查看:90
本文介绍了JPA CascadeType.PERSIST如何工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的示例中,Employee与具有CascadeType.PERSISTDepartment具有OneToOne关系. 当我坚持多个Employee

In my example, Employee has an OneToOne relationship to Department with CascadeType.PERSIST. When I persist multiple Employee,

为什么EntityManager为所有Employee记录保留单个Department记录?

Why does the EntityManager persist a single Department record for all Employee records?

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

My expectation is, if we use CascadeType.PERSIST, when an Employee is being persisted, a Department record will be created anew for each Employee record.

Employee.java

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

Department.java

@Entity
public class Department implements Serializable {
    private String id;
    private String name;
}

Test.java

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

结果:

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   

推荐答案

JPA维护对象标识,并且不会持久化现有对象.

JPA maintains object identity and will not persist an existing object.

将您的代码更改为正确的

Change you code to be correct,

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

这篇关于JPA CascadeType.PERSIST如何工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆