java—关系应该只在hibernate中是懒惰的还是急切的?

f0brbegy  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(242)

我对冬眠有点困惑 fetch 选项。我在我的项目中使用springboot2、spring数据和hibernate。假设我有一个实体 User . 每个 User 可能有很多 Post 当然每个人 Post 可能有很多 Comment 实体。我设计了 SQL 如下所示的数据库表;

User
id (PK)
username
password

Post
id (PK)
title
content
user_id (FK)

Comment
id (PK)
content
post_id (FK)

因此,如果我需要列出特定用户的帖子,就不需要获取评论。 LAZY 那当然更好了。但是,如果我需要返回特定的post do display,我需要同时获取post及其评论。所以, EAGER 应使用fetch。
我应该如何定义类的获取类型?我确信这些关系数据库有一个设计模式,但我不知道。所有的教程都解释了lazy和eager获取类型、优缺点,但是我没有找到在需要同时使用lazy和eager时该怎么做。我试图定义抓取和使用 Spring Data Repository 简化数据库查询的接口。对于急切的抓取,我尝试编写一个自定义数据库查询。但是,我无法查询嵌套联接(即查询特定用户的所有帖子及其评论)。我可以查询第一个用户,然后每个用户的帖子,然后每个帖子的评论,但正如你所知道的,它不是应该如何。
这类关系数据的通用模式是什么?小时

34gzjxbg

34gzjxbg1#

你应该使用 @OneToManyFetchType.LAZY (无需设置为默认值)

public class Post {

    //other fields
    @OneToMany
    private List<Comment> comments;

    //getters and setters
    public List<Comment> getComments() {
        return comments;
    }

    public void setComments(List<Comment> comments) {
        this.comments = comments;
    }
}

另外,如果您试图访问事务范围之外的列表,那么您将得到 LazyInitializationException 因为hibernate不会发出额外的查询来获取 FetchType.LAZY 收藏。
要在事务范围之外解决此问题,可以使用

Hibernate.initialize(post.getComments());

对于要加载评论的帖子。但是,如果尝试访问事务作用域中的注解,则不需要手动初始化,hibernate将根据需要发出查询。

相关问题