偶然发现一个问题:在一对多关系中,似乎从父实体自动生成的主键不会馈送到子实体。
我将生产代码归结为以下示例:
import io.micronaut.data.annotation.GeneratedValue
import io.micronaut.data.annotation.Id
import io.micronaut.data.annotation.MappedEntity
import io.micronaut.data.annotation.Relation
import io.micronaut.data.annotation.Relation.Cascade.PERSIST
import io.micronaut.data.annotation.Relation.Kind.ONE_TO_MANY
import io.micronaut.data.model.naming.NamingStrategies
@MappedEntity("Parent", namingStrategy = NamingStrategies.Raw::class)
data class Parent(
@GeneratedValue @field:Id val id: Long?,
val name: String,
@field:Relation(ONE_TO_MANY, mappedBy = "parent_id", cascade = [PERSIST])
val children: List<Child>? = emptyList()
) {
// Copy-constructor, used by ORM:
constructor(
name: String,
children: List<Child>?
) : this(
null,
name,
children
)
}
@MappedEntity("Child", namingStrategy = NamingStrategies.Raw::class)
data class Child(
@GeneratedValue @field:Id val id: Long?,
val parent_id: Long?, …
Run Code Online (Sandbox Code Playgroud) 我使用 Micronaut 3.1.3 和 Gradle 7.2 来构建我的项目。
切换到 Gradle 7.3后,内置中断会发出一些上下文无关的错误消息:
$ ./gradlew clean build
Executed by Gradle 7.3
- using Java 11.0.13
- using Kotlin 1.5.31
- using Groovy 3.0.9
FAILURE: Build failed with an exception.
* What went wrong:
A problem occurred configuring root project '[PROJECT]'.
> The value for this property is final and cannot be changed any further.
Run Code Online (Sandbox Code Playgroud)
随着--stacktrace
一条很长的痕迹出现。以下摘录让我猜测问题可能出在 Micronaut 插件上:
* Exception is:
org.gradle.api.ProjectConfigurationException: A problem occurred configuring root project '[PROJECT]'.
at org.gradle.configuration.project.LifecycleProjectEvaluator.wrapException(LifecycleProjectEvaluator.java:75) …
Run Code Online (Sandbox Code Playgroud) 自上周(首次发生于 2023 年 5 月 9 日)以来,我们基于 Micronaut 的应用程序的 Gradle 构建失败了
[...]
> Task :openApiGenerate FAILED
Error snake-parsing yaml content
java.lang.NoSuchMethodError: org.yaml.snakeyaml.constructor.SafeConstructor: method 'void <init>()' not found
at io.swagger.v3.parser.util.DeserializationUtils$CustomSnakeYamlConstructor.<init>(DeserializationUtils.java:393)
at io.swagger.v3.parser.util.DeserializationUtils.readYamlTree(DeserializationUtils.java:207)
at io.swagger.v3.parser.util.DeserializationUtils.deserializeIntoTree(DeserializationUtils.java:143)
at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:165)
at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:94)
at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
at org.openapitools.codegen.config.CodegenConfigurator.toContext(CodegenConfigurator.java:589)
at org.openapitools.codegen.config.CodegenConfigurator.toClientOptInput(CodegenConfigurator.java:647)
at org.openapitools.generator.gradle.plugin.tasks.GenerateTask.doWork(GenerateTask.kt:825)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java
[...]
Run Code Online (Sandbox Code Playgroud)
该项目利用了——除其他外——
3.9.1
在调查了一些可能的根本原因后,对我来说,这似乎是由于 3rd-party lib 的snakeyaml
版本与该库的“交叉使用”之间的1.33
不2.0
兼容更改引起的:
3.9.1
使用snakeyaml版本,在他的BOM2.0
中声明:
$ ./gradlew dependencyInsight --dependency …
Run Code Online (Sandbox Code Playgroud)