我在Spring启动应用程序中使用JPA,遇到了以下问题。用户之间存在一对多关系->字母
用户实体
@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 同步