休眠惰性关系被获取 n+1,而不调用属性 - Kotlin



我正在使用休眠并执行简单的查询来选择所有给定实体。我只想要实体而不是它的关系。但是,休眠确实以 n+1 的方式获取关系和关系的关系。

这是一个 Spring Boot 应用程序,用 Kotlin 编写。

这些关系用 FetchType.LAZY 注释,我正在做的查询如下所示:

entityManager.createQuery("SELECT a FROM Apartment a")
.resultList

这是我调用的唯一代码,我什至不从控制器返回结果,因此它不是调用惰性属性的序列化库。

这些是实体:

@Entity
class Apartment(
@Id
private val id: String,
private val heading: String,
@ManyToOne(fetch = LAZY)
private val building: Building
)
@Entity
class Building(
@Id
private val id: String,
private val heading: String,
@ManyToOne(fetch = FetchType.LAZY)
private val owner: User
)
@Entity
@Table(name="users")
class User(
@Id
private val id: String,
private val email: String
)

我已经打开了休眠查询日志记录,当我运行上面的查询时,它看起来像:

Fetch all apartments
Fetch buildings for apartment 1
Fetch users for building 1
fetch buildings for apartment 2
fetch users for building 2
....

我创建了一个重现问题的 git 存储库:https://github.com/Herlevsen/hibernate-lazy-fetch-repoduction

它附带了一个 docker-compose 文件,该文件启动了一个 postgres 数据库,应用程序会自动创建架构并在启动时创建一些虚拟数据。因此,启动和运行起来相当容易。

我真的希望有人能告诉我发生了什么。

谢谢!

您必须open实体类。Hibernate需要open类来创建代理以支持LAZY-ManyToOne字段:

@Entity
open class Apartment(
@Id
private val id: String,
private val heading: String,
@ManyToOne(fetch = LAZY)
private val building: Building
)
@Entity
open class Building(
@Id
private val id: String,
private val heading: String,
@ManyToOne(fetch = FetchType.LAZY)
private val owner: User
)
@Entity
@Table(name="users")
open class User(
@Id
private val id: String,
private val email: String
)

您也可以使用all-open插件。

最新更新