使用 Spring Boot 和 Kotlin 的嵌入式实体

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

我在 Kotlin 项目中使用 Spring Boot 3.2.2 并尝试在实体类中使用 Embedded 对象

import org.springframework.data.repository.kotlin.CoroutineCrudRepository
import java.io.Serializable
import javax.persistence.Embeddable
import javax.persistence.Embedded
import javax.persistence.Entity
import javax.persistence.Id

@Entity
class TestEntity(
    @Id
    val id: Long,
    @Embedded
    val emb: Emb
)

@Embeddable
class Emb(
    val field: String
)

interface TestEntityRepository : CoroutineCrudRepository<TestEntity, Long>

所以,我的项目中使用了kotlin JPA和spring插件:

    kotlin("plugin.jpa") version "1.9.21"
    id("io.spring.dependency-management") version "1.1.0"
    id("org.springframework.boot") version "3.2.2"

当我尝试使用

TestEntityRepository
存储库保存实体时:

testEntityRepository.save(TestEntity(1L, Emb("asd")))

我遇到以下异常:

3:37:20.336 [main] ERROR o.s.c.e.ApplicationListenerMethodAdapter - Unexpected error occurred in asynchronous listener
org.springframework.dao.InvalidDataAccessApiUsageException: Nested entities are not supported
    at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.writePropertyInternal(MappingR2dbcConverter.java:251)
    at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.writeProperties(MappingR2dbcConverter.java:218)
    at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.writeInternal(MappingR2dbcConverter.java:189)
    at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.write(MappingR2dbcConverter.java:181)
    at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.write(MappingR2dbcConverter.java:61)
    at org.springframework.data.r2dbc.core.DefaultReactiveDataAccessStrategy.getOutboundRow(DefaultReactiveDataAccessStrategy.java:177)
...

似乎嵌入应该有效,为什么在这种特殊情况下它不起作用?

spring kotlin jpa
1个回答
0
投票

如果您阅读堆栈跟踪,错误就会变得非常清楚

org.springframework.dao.InvalidDataAccessApiUsageException:嵌套 不支持实体 在org.springframework.data.r2dbc.convert。MappingR2dbcConverter.writePropertyInternal(MappingR2dbcConverter.java:251)

如果您检查文档,它也会被验证

基于约定的映射

....

不支持嵌套对象。

根据文档解决您问题的方法是根据您的需要注册您自己的转换器,它将支持嵌套对象

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