问题描述
我有这个实体:
@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 (将#修改为@)