Hibernate字节码增强错误地应用于每个字段
我有这个实体:Hibernate字节码增强错误地应用于每个字段,hibernate,kotlin,lazy-loading,jvm-bytecode,byte-code-enhancement,Hibernate,Kotlin,Lazy Loading,Jvm Bytecode,Byte Code Enhancement,我有这个实体: @Repository interface SimpleEntityRepository : JpaRepository<SimpleEntity, Long> @Entity open class SimpleEntity( @Basic(fetch = FetchType.EAGER) open var first: String, open var second: Long, open var third: Boolean,
@Repository
interface SimpleEntityRepository : JpaRepository<SimpleEntity, Long>
@Entity
open class SimpleEntity(
@Basic(fetch = FetchType.EAGER)
open var first: String,
open var second: Long,
open var third: Boolean,
@Id @GeneratedValue
open var id: Long = 0
) {
constructor() : this("first", 2, false)
}
@存储库
接口SimpleEntityRepository:JpaRepository
@实体
开放类简单性(
@基本(fetch=FetchType.EAGER)
首先打开var:String,
打开第二个:长,
第三个开放变量:布尔,
@Id@GeneratedValue
打开变量id:Long=0
) {
构造函数():此(“第一个”,2,false)
}
正如您所看到的,每个字段都是开放的(不是最终的),类也是开放的,我有一个默认的构造函数(我知道有一些插件只是这样做,但现在它超出了范围)
所有字段都是Basic
hibernate字段,如果这些字段上没有@Basic(fetch=FetchType.LAZY)
注释,则应立即获取这些字段。我所期望的是,没有一个的字段通过插件得到增强,但是,如果我启用它,它会尝试增强每个字段 即使我显式地将每个字段注释为
@Basic(fetch=FetchType.EAGER)
插件仍然会增强它。我甚至用
javap
验证了这一点,它们都是字节码增强的。我尝试使用运行时增强,希望由于某种奇怪的原因,结果会改变,但显然不会 为什么插件试图增强所有实体的所有基本字段?!这是设计的吗?
这会在我的final字段的生产代码中产生IllegalAccessError(显然是因为无法在该字段上设置获取的惰性值),但我从未将它们注释为惰性 我在github上有一个这种行为的例子: git@github.com:BlackTazz89/hibernate-enhance-square-behavior.git 如果要执行快速检查,只需克隆回购并执行:
/mvnw clean-package&&javap-v target/classes/com/example/demo/core/simplentity.class | grep“Method\$\$\u hibernate”
要触发final字段的问题,只需更改val first
中的var first
字段,运行java-jar-target/demo-0.0.1-SNAPSHOT.jar
,您将看到:
java.lang.IllegalAccessError:更新到非静态最终字段com.example.demo.core.SimpleEntity.first尝试使用与初始值设定方法不同的方法($$\u hibernate\u write\u first)
有人有办法解决这个问题吗
非常感谢,祝你今天愉快