【发布时间】:2020-11-22 02:14:35
【问题描述】:
我在我的 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 专家,但我不明白为什么它不起作用是第二种情况?
【问题讨论】:
-
也许它不能解决你的问题,但我强烈建议从子
Letter实体中删除CascadeType.ALL- 当你删除一些字母时,用户也会被删除。还要为User添加同步addLetter、removeLetter方法以保持数据一致。 -
controller.createUser(user);方法是否返回持久实体?您的数据库表级别是否有参照完整性约束?
标签: java database hibernate jpa spring-data-jpa