问题描述
我在我的 kotlin 项目中使用了编译时休眠字节码增强:
plugins {
id "org.jetbrains.kotlin.jvm"
id "org.jetbrains.kotlin.plugin.jpa"
}
apply plugin: "org.hibernate.orm"
hibernate {
enhance {
enableLazyInitialization = true
enableDirtyTracking = true
}
}
compileKotlin {
kotlinoptions.jvmTarget = JavaVersion.VERSION_11
doLast {
EnhancementHelper.enhance(
sourceSets.getByName("main"),project.extensions.findByType(HibernateExtension.class).enhance,project
)
}
}
我有 jpa 实体:
@Entity
@Table(schema = "the_schema",name = "the_table")
class TheEntity(
var field1: String? = null
) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = 0
@OnetoMany(
cascade = [CascadeType.ALL],orphanRemoval = true,mappedBy = "otherField"
)
@OrderBy("id ASC")
private val someList: MutableList<Some> = ArrayList()
// other fields
}
应用程序启动失败并出现以下错误:
Caused by: java.lang.IllegalAccessError: Update to non-static final field
my.package.TheEntity.someList attempted from a different method ($$_hibernate_write_someList) than the initializer method <init>
at my.package.TheEntity.$$_hibernate_write_someList(TheEntity.kt)
at my.package.TheEntity.<init>(TheEntity.kt:29)
at my.package.TheEntity.<init>(TheEntity.kt:17)
at my.package.TheEntity.<init>(TheEntity.kt)
... 43 common frames omitted
经过一番调查,我在这里发现了类似的问题: eclipselink static weaving with final fields on Java 9
以及在java9中修复的相应错误:https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8157181
如果我将 someList
定义为 var
错误显然消失了。
我的问题是:有没有其他解决方案来代替使所有字段都不是最终字段(即 var
)或字节码增强与在 Java 11 字节码中编译的 kotlin 不兼容?
使用的库:
- kotlin:1.3.72
- hibernate:5.4.25.Final(gradle 插件和核心)
- byte-buddy:1.10.17(用于字节码增强)
- javassist:3.27.0-GA
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)