【问题标题】:Cannot fetch child items using JPA无法使用 JPA 获取子项
【发布时间】: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添加同步addLetterremoveLetter方法以保持数据一致。
  • controller.createUser(user); 方法是否返回持久实体?您的数据库表级别是否有参照完整性约束?

标签: java database hibernate jpa spring-data-jpa


【解决方案1】:

您没有在第二个示例中执行user.setLetters(letters);。正如我在评论中已经说过的,添加同步方法来避免这种错误。

例如查看此博客 How to synchronize bidirectional entity associations with JPA and Hibernate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 2015-05-26
    相关资源
    最近更新 更多