java - 无法使用 JPA 获取子项目
问题描述
我在我的 Spring Boot 应用程序中使用 JPA,我遇到了以下问题。User -> Letter 之间存在 oneToMany 关系
用户实体
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<Letter> letters;
字母实体
@Entity
public class Letter {
@Id
@GeneratedValue
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private User user;
此代码在以下情况下正常工作:
Letter letter = new Letter();
Set<Letter> letters = new HashSet<>();
letters.add(letter);
User user = new User();
user.setLetters(letters);
User newUser = controller.createUser(user);
User retrievedUser = controller.getUser(newUser.getId());
retrievedUser.getLetters() // contains letter
但是当我想先创建用户并在之后添加字母时它无法正常工作
User user = new User();
User newUser = controller.createUser(user);
Letter letter = new Letter();
letter.setUser(newUser);
Letter newLetter = controller.createLetter(letter);
User retrievedUser = controller.getUser(newUser.getId());
retrievedUser.getLetters() // is null
我不是 JPA 专家,但我不明白为什么它不起作用是第二种情况?
解决方案
你没有user.setLetters(letters);
在你的第二个例子中表演。正如我在评论中已经说过的那样,添加同步方法以避免这种错误。
例如查看此博客 如何将双向实体关联与 JPA 和 Hibernate 同步
推荐阅读
- android - Google Play 应用链接链接到 Play 主页而不是应用详细信息页面
- datetime - SSRS 无效输入参数
- mysql - 检查字符串编号
- python-3.x - AWS Step Function 中的 lambda 能否知道其当前 AWS Step Function 的执行 ID?
- c - Visual Studio 2017 是否对 C 进行语法检查?
- prometheus - Prometheus 1.8/2.2.1 scrape 给出“无令牌”错误 - promtool 仅显示几个警告
- angular - angular-l10n 与 ngx-translate 的优缺点
- hadoop - 如何删除 Hive 中的两个分区列之一?
- javascript - 选中或取消选中复选框中的问题
- angular - 动态更改提供者