【问题标题】:How to get parent entity with all child entities and child entities of children in Spring/JPA/Hibernate with Lombok如何使用 Lombok 在 Spring/JPA/Hibernate 中获取具有所有子实体的父实体和子实体的子实体
【发布时间】:2021-10-19 11:45:04
【问题描述】:

我有这些实体,其中 Shop 实体是父实体:

@Data
@NoArgsConstructor
@Entity
@DynamicUpdate
@Table(name = "Shop", schema = "public")
public class ShopDao {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;
    private String name;
    private String processedStatus;
    @OneToMany(mappedBy = "shopDao", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<BookDao> bookDaoList;
}
@Data
@NoArgsConstructor
@Entity
@ToString(exclude = {"shopDao"})
@Table(name = "Book", schema = "public")
public class BookDao {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;
    private String name;
    private String author;
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "other_id", referencedColumnName = "id")
    private OtherDao otherDao;

    @ManyToOne
    @JoinColumn(name = "shop_id", nullable = false)
    private ShopDao shopDao;
}
@Data
@NoArgsConstructor
@Entity
@ToString(exclude = {"bookDao"})
@Table(name = "Other", schema = "public")
public class OtherDao {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;
    private String metadata;

    @OneToOne(mappedBy = "otherDao", fetch = FetchType.EAGER)
    private BookDao bookDao;
}

这些是回购:

@Repository
public interface ShopRepo extends JpaRepository<ShopDao, Long> {
    @EntityGraph(attributePaths = {"bookDaoList"})
    List<ShopDao> findAllByProcessedStatus(String processedStatus);
}
@Repository
public interface BookRepo extends JpaRepository<BookDao, Long> {
}
@Repository
public interface OtherRepo extends JpaRepository<OtherDao, Long> {
}

当我使用findAllByProcessedStatus() 函数时,我在 Shop 对象中正确获取了 BookList,但是每本书都无法访问它们的其他对象并且我得到 LazyInitializationException: screenshot

我该如何解决这个问题?

【问题讨论】:

    标签: java spring hibernate lombok


    【解决方案1】:

    实际上,使用 spring data 的 @EntityGraph 你只需要:

    @Repository
    public interface ShopRepo extends JpaRepository<ShopDao, Long> {
        @EntityGraph(attributePaths = {"bookDaoList.otherDao"})
        List<ShopDao> findAllByProcessedStatus(String processedStatus);
    }
    

    这是最方便的方法。 对于更复杂的关系,您可以定义一个@NamedEntityGraph,并提供子图,例如so

    我觉得有趣的是,BookDao 是这个关系的所有者,所以我希望它会被急切地加载,因为你没有明确指定 Lazy fetch 模式......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      相关资源
      最近更新 更多