JPA在@ManyToOne和@OneToMany中持久化和获取



我正在努力理解JPA OneToMany/ManyToOne。截至目前,正试图理解mappedBy和JoinColumn。

我的实体:


import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.persistence.*;
@Entity
@Table(name = "mobile_number")
@Data
@ToString(exclude = "student")
public class MobileNumber {
@Id
private String number;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "student_id")
private Student student;
}
package com.example.demo.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.persistence.*;
import java.util.Set;
@Entity
@Table(name = "student")
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "student")
private Set<MobileNumber> mobileNumberSet;

}

我目前的理解:

在这里,MobileNumber是关系的拥有方。由此,我了解到我可以使用MobileNumber实体来持久化/获取学生实体。

因此,如果我简单地写下以下代码:|

MobileNumber mn = new MobileNumber();
mn.setNumber("some_number");
Student s = new Student();
s.setName("TestUser");

mn.setStudent(s);
mobileNumberRepository.save(mn);
  • 它将自动持久化Student并进行映射
  • 我可以使用Student实体获取MobileNumber实体
  • 如果我现在获取Student实体,我将使用相应的MobileNumbers对象填充集合

如果以上几点是正确的,请帮助我

混淆领域:

我也试过另一种方法尝试坚持学生:

Student s = new Student();
s.setName("TestUser");
MobileNumber mn = new MobileNumber();
mn.setNumber("some_number");
Set<MobileNumber> set = new HashSet<>();
set.add(mn);
s.setMobileNumberSet(set);
studentRepository.save(s);

现在我不明白了,这种行为出乎意料。我根本看不到MobileNumber被持久化。

有人能帮助我从这个角度获取和持久化子实体(MobileNumber(是如何工作的吗。

感谢

当您处理双向一对多关联时,您必须始终保持两侧的关联同步。来自Hibernate ORM文档:

无论何时形成双向关联,应用程序开发人员都必须确保双方始终同步。

您的代码应该如下所示:

Student s = new Student();
s.setName("TestUser");
MobileNumber mn = new MobileNumber();
mn.setNumber("some_number");
mn.setStudent(s);
Set<MobileNumber> set = new HashSet<>();
set.add(mn);
s.setMobileNumberSet(set);
studentRepository.save(s);

请注意,您也可以将属性hibernate.enhancer.enableAssociationManagement设置为true。这将启用Hibernate ORM字节码增强功能,您以前的代码也会起作用。

最新更新