java - 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 :
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)。
谢谢
解决方案
当您处理双向的一对多关联时,您必须始终保持关联在双方同步。从休眠 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字节码增强功能,并且您之前的代码可以正常工作。
推荐阅读
- gnuplot - 如何管理等高线图的颜色?
- c - 我仍然可以在 macOS Mojave 下使用 gcc 使用 OpenGL 处理 C 项目吗?
- android - 从一个apk文件中,我们可以删除一个android应用程序的活动吗
- javascript - 没有 Node js 的网页抓取可能吗?
- javascript - 无法在 React 组件中渲染子级
- python - Discord Bot - 在消息后赋予角色,Python
- javascript - 设置或删除项目时如何查找 Map() 中的更改?
- swift - 将@IBInspectable 与情节提要中的任何 UIView 子类一起使用
- dart - Flutter FutureBuilder 显示黑屏
- dart - Dart/Flutter 河豚 CBC