Spring jpa Hibernate ManyToOne 关联即使 FetchType.LAZY 也会急切加载

问题描述 投票:0回答:1

我有一个单向 ManyToOne 关系,声明为 FetchType.lAZY ,但是当我使用 Spring jpa repo (query dsl) findAll() 查询时,即使 DTO 层根本不访问此参数,ManyToOne 也会被急切加载。spring.jpa .open-in-view = false。我正在使用 Spring boot 3.(Hibernate) 假设我有 Employee 实体,其中办公室地址为 ManyToOne 关系

@Entity
@Table(name = "Employee")
class Employee {

    @Id
    @Column
    val id: String,

    @ManyToOne(fetch = FetchType.LAZY)
    var group: UserGroup,

    /**
     * The address that employee belongs to.
     */
    @ManyToOne(fetch = FetchType.LAZY)
    var officeAddress: Address,
}

@Entity
@Table(name = "Address")
class Address {

    @Id
    @Column
    val id: String,

    //Other fields here
}

在DTO层,我根本没有访问officeAddress; 我启用了休眠查询,
我可以在控制台中看到休眠状态 当我执行以下操作时,触发查询以获取 officeAddress。

@EntityGraph(attributePaths = ["group"], type = EntityGraph.EntityGraphType.FETCH)
employeeRepository.findAll(Predicate)

该实体由两个模块共享,在一个模块中, 我只需要 DTO 中的办公室地址 ID,在另一个中我需要整个办公室地址。 请注意:即使我根本不访问办公室地址,hibernate 仍然会以任何方式加载整个实体。

我尝试过 FetchType.LAZY ,但它不起作用,它的唯一工作方式就是我说

@Column
var officeAddressId: String; 

但正如我所说,我需要在某些情况下完全加载地址,而在某些情况下我只需要 Id 而无需完全加载它。

还尝试添加地址 ID 和地址,如下所示:

@Column(updatable=false, insertable=false)
var officeAddressId: String 

@ManyToOne(fetchType.LAZY)
var officeAddress: Address

无论我是否访问任何内容,这都会加载实体。

spring hibernate spring-data-jpa many-to-one
1个回答
0
投票

经过如此多的调查,我找到了我的问题的答案。我正在使用 kotlin 作为 Spring Boot 3 应用程序。我在构建 gradle 文件中有 kotlin jpa 插件和 kotlin spring 插件。默认情况下,Kotlin 类是最终的。我假设 kotlin jpa 将打开该类(使类非最终),但事实并非如此。 所以我必须包含 kotlin 全开放插件,如下所示

plugins {
id("org.jetbrains.kotlin.plugin.allopen")
id("org.springframework.boot")
id("io.spring.dependency-management")
kotlin("jvm")
kotlin("plugin.spring")
kotlin("plugin.jpa")
kotlin("kapt")
id("org.jlleitschuh.gradle.ktlint")

}

allOpen {
annotation("jakarta.persistence.Entity")
annotation("jakarta.persistence.Embeddable")
annotation("jakarta.persistence.MappedSuperclass")}

这是春季 3 的

© www.soinside.com 2019 - 2024. All rights reserved.