休眠字节码增强错误地应用于每个字段

问题描述

我有这个实体:

@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)
}

如您所见,每个字段都是打开的(不是最终的),该类也是打开的,并且我有一个认的构造函数(我知道有些插件可以执行此操作,但现在超出了范围)。 / p>

所有字段均为Basic休眠字段,鉴于它们上没有@Basic(fetch = FetchType.LAZY)批注,应热切获取
我期望的是,插件不会增强此字段的没人,但是,如果启用它,它将尝试增强每个字段。

即使我显式地注释了每个字段,因为@Basic(fetch = FetchType.EAGER)插件仍然可以增强它。
我什至用javap进行了验证,并且它们均已字节码增强。
我尝试使用运行时增强,希望出于某种奇怪的原因,结果有所变化,但显然没有。

为什么插件会尝试增强所有实体的所有基本字段?是故意设计的吗?
这会在生产代码中的 final 字段上产生IllegalAccessError(显然是因为无法在该字段上设置fetched-lazy值),但我从未将它们注释为lazy。

我在github上有此行为的示例:

git@github.com:BlackTazz89 / hibernate-enhance-strange-behavIoUr.git

如果要进行快速检查,只需克隆存储库并执行:

./mvnw clean package && javap -v target/classes/com/example/demo/core/SimpleEntity.class | grep "Method \$\$_hibernate"

要使用 final 字段触发问题,只需更改var first中的val first字段,运行java -jar target/demo-0.0.1-SNAPSHOT.jar,您将看到:

java.lang.IllegalAccessError: Update to non-static final field com.example.demo.core.SimpleEntity.first attempted from a different method ($$_hibernate_write_first) than the initializer method <init>

有人对如何解决有想法?

非常感谢,
祝你有美好的一天

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

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