关系应该只在休眠状态下为LAZY还是EAGER?

时间:2018-08-14 17:59:58

标签: java mysql hibernate spring-boot spring-data-jpa

对于Hibernate fetch选项,我有些困惑。我在项目中使用Spring Boot 2,Spring Data和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提取当然会更好。但是,如果需要返回特定的帖子显示,则需要同时获取帖子及其评论。因此,应使用EAGER提取。

如何在类中定义提取类型?我确定这些关系数据库有一种设计模式,但我不知道。所有教程都解释了LAZY和EAGER的获取类型,优缺点,但是当我需要同时使用LAZY和EAGER时,我没有发现如何做。我尝试定义提取LAZY并使用Spring Data Repository接口简化数据库查询。对于EAGER提取,我尝试编写一个自定义的数据库查询。但是,我无法查询嵌套的联接(即查询特定用户或所有用户的所有帖子及其评论)。我可以先查询用户,然后每个用户发帖,然后每个帖子发表评论,但是您知道应该不是这样。

这类关系数据的常见模式是什么?高

1 个答案:

答案 0 :(得分:0)

您应该将@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,因为休眠状态不会发出其他查询来获取FetchType.LAZY集合的价值。

要在交易范围之外解决此问题,您可以使用

Hibernate.initialize(post.getComments());

对于要加载评论的帖子。但是,如果您尝试在事务范围内访问注释,则无需手动初始化,休眠将按需发出查询。