首页 > 解决方案 > 不尊重 Kotlin JPA Lazy RestAPI

问题描述

我有一个 Java 项目,我正在转换为 Kotlin,但是具有关系和映射 @ManytoOne 的实体存在问题。他们使用映射 fecht 类型 LAZY 的实体,他们不是尊重 LAZY 并执行查询。

示例:

实体父亲:

@Entity
@Table(name = "TIPOSITUACAO")
data class TipoSituacao (
    @Id
    @Column(name = "ID")
    val id: Long? = null,

    @Column(name = "DESCRICAO")
    val descricao: String? = null
)

实体儿子:

@Entity
@Table(name = "SITUACAO")
data class Situacao (

    @Id
    @Column(name = "ID")
    val id: Long,

    @Column(name = "DESCRICAO")
    val descricao: String = "",

    @Column(name = "TIPOSITUACAO_ID")
    val tipoSituacaoId: Long? = null,

    @ManyToOne(fetch = FetchType.LAZY, optional = true)
    @JoinColumn(name = "TIPOSITUACAO_ID", referencedColumnName = "ID", insertable = false, updatable = false)
    val tipoSituacao: TipoSituacao? = null
)

我的端点:

@RequestMapping("/api")
@RestController
class EndPoints {
    @Autowired
    private val situacaoRepository: SituacaoRepository? = null

   val situacao: List<Situacao>
        @GetMapping(value = ["/situacao"])
        get() = situacaoRepository!!.findAll()
}

返回:

[
    {
        "id": 1,
        "descricao": "SITUACAO 1.1",
        "tipoSituacaoId": 1,
        "tipoSituacao": {
            "id": 1,
            "descricao": "TIPO SITUACAO 1"
        }
    },
    {
        "id": 2,
        "descricao": "SITUACAO 1.2",
        "tipoSituacaoId": 1,
        "tipoSituacao": {
            "id": 1,
            "descricao": "TIPO SITUACAO 1"
        }
    },
    {
        "id": 3,
        "descricao": "SITUACAO 2.1",
        "tipoSituacaoId": 2,
        "tipoSituacao": {
            "id": 2,
            "descricao": "TIPO SITUACAO 2"
        }
    }
]

查询:

Hibernate: select situacao0_.id as id1_0_, situacao0_.descricao as descrica2_0_, situacao0_.tiposituacao_id as tipositu3_0_ from situacao situacao0_
Hibernate: select tiposituac0_.id as id1_1_0_, tiposituac0_.descricao as descrica2_1_0_ from tiposituacao tiposituac0_ where tiposituac0_.id=?
Hibernate: select tiposituac0_.id as id1_1_0_, tiposituac0_.descricao as descrica2_1_0_ from tiposituacao tiposituac0_ where tiposituac0_.id=?

如果我使用@JsonIgnore@JsonManageReference@JsonBackReference o 儿子 TipoSituacao 直到不返回,但查询继续执行。

我尝试使用 DTO,但同样的问题。

每次我使用 situacaoRepository.find 或 findAll 时都会执行查询。

有问题的项目链接:https ://github.com/maxbrizolla/spring-kotlin-jpa-problem

有人可以帮助我吗?

标签: javajpakotlinlazy-loadingmany-to-one

解决方案


The problem here is your data class gets autogenerated toString, equals and hashcode methods which trigger property loading so hibernate execute extra required queries for that.

Data classes are not encouraged to be used with JPA.


推荐阅读