【发布时间】:2019-01-21 15:47:54
【问题描述】:
我对 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)
因此,如果我需要列出特定用户的帖子,则无需获取 cmets。 LAZY fetch 当然会更好。但是,如果我需要返回特定的帖子做显示,我需要同时获取帖子及其 cmets。所以,EAGER fetch 应该被使用。
我应该如何在我的类中定义提取类型?我确信这些关系数据库有一种设计模式,但我想不通。所有教程都解释了 LAZY 和 EAGER 获取类型、优缺点,但是当我需要同时使用 LAZY 和 EAGER 时,我没有找到该怎么做。我试图定义 fetches LAZY 并使用Spring Data Repository 接口来简化数据库查询。对于 EAGER 获取,我尝试编写自定义数据库查询。但是,我无法查询嵌套连接(即查询特定用户的所有帖子及其 cmets)。我可以查询第一个用户,然后每个用户发布然后每个发布 cmets,但正如您所知,它不应该是这样。
这类关系数据的常见模式是什么? H
【问题讨论】:
-
您无需编写查询,只需指定如何使用
@OneToMany(fetch=FetchType.LAZY)获取数据即可。 -
当我这样做时,如果我尝试访问 post.cmets,它会抛出一个 LazyInitializationException
-
我认为你的 JPA 配置有问题
标签: java mysql hibernate spring-boot spring-data-jpa