【问题标题】:How to configure cascade type in JPA for many to one relationship?如何在 JPA 中为多对一关系配置级联类型?
【发布时间】:2018-07-16 22:38:52
【问题描述】:

我对 Hibernate Java 持久性框架比较陌生,我正在尝试了解 Cascade 类型的工作原理。

我有两张表,一张是Assignment,一张是Student。 assignment表有assignmentNumber列、assignmentDescription列、assignmentGrade列和studentNumber列(Student列中的外键)。

Assignment|
-------

- assignmentNumber
- assignmentDescription
- assignmentGrade
- studentNumber

Student |
-------
- studentNumber
- studentFirst
- studentLast

学生表和作业表之间存在多对一的关系,因为可以为学生分配多个作业。所以在 AssignmentEntity 类中,我有以下设置:

@Entity
@Table(name = "ASSIGNMENT")
public class AssignmentEntity {

@Column(name = "assignmentNumber")
private Long assignmentNumber;

@Column(name = "assignmentGrade")
private String assignmentGrade;

@Column(name = "assignmentDescription")
private String assignmentDescription;

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "studentNumber")
private StudentEntity studentEntity;

在 StudentEntity 类中:

@Entity
@Table(name = "STUDENT")
public class StudentEntity {

@Id
@Column(name = "studentNumber")
private String studentNumber;

@Column(name = "studentFirst")
private String studentFirst;

@Column(name = "studentLast")
private String studentLast;

这就是我遇到的问题:我应该将级联类型更改为什么,以便如果学生已经存在,当我保存新作业时不会有新条目?仅当与学生表中尚不存在的新学生一起保存作业时,我才想插入学生表。

【问题讨论】:

  • 明确地说,我还想确保如果我删除一个作业,与该作业关联的学生不会被删除。

标签: hibernate jpa foreign-keys spring-data-jpa


【解决方案1】:

如果使用得当,JPA 已经在这样做了。您没有描述如何创建实体实例,但它应该是这样的(对于已经存在的学生):

  1. EntityManager/repository 加载Student
  2. Assignment 引用该实例。
  3. 利润。

关键是不要通过调用new 并设置它的Id 来创建Student 的实例。

【讨论】:

  • 如果我想删除作业但确保学生不会随之被删除,这也可以吗?
  • 在这种情况下,您不应该使用CascadeType.ALL。见vladmihalcea.com/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 2013-12-04
  • 2015-07-23
相关资源
最近更新 更多