从 java 8 迁移到 java 11 后,Hibernate 字节码增强停止工作

问题描述

我在我的 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...