对于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提取,我尝试编写一个自定义的数据库查询。但是,我无法查询嵌套的联接(即查询特定用户或所有用户的所有帖子及其评论)。我可以先查询用户,然后每个用户发帖,然后每个帖子发表评论,但是您知道应该不是这样。
这类关系数据的常见模式是什么?高
答案 0 :(得分:0)
您应该将@OneToMany
与FetchType.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());
对于要加载评论的帖子。但是,如果您尝试在事务范围内访问注释,则无需手动初始化,休眠将按需发出查询。