【发布时间】:2018-03-04 16:50:37
【问题描述】:
我有一些像这样声明为 final 的 JPA 注释字段:
@Column(name = "SOME_FIELD", updatable = false, nullable = false)
private final String someField;
当实体插入数据库时,这些字段存储在数据库中。它们无法进一步更新。对于 Java 编程语言,这样的字段可以被认为是 final 的。
使用 EclipseLink 静态编织插件,由于某些字节码检测,可以延迟加载实体。
我不知道 JPA 中是否正式允许此类构造(最终字段),但我喜欢使用它们,因为它们在编译时强制这些字段不打算更新。
在 Java 8 中,使用这种结构构建的程序运行良好。但是在 Java 9 中,当涉及到 EclipseLink 静态编织时,我得到以下运行时异常:
Caused by: java.lang.IllegalAccessError: Update to non-static final field xxx.yyy.SomeEntity.someField attempted from a different method (_persistence_set) than the initializer method <init>
这样的错误似乎是由于以下JVM规范:
否则,如果该字段是final,则必须在当前声明 类,并且指令必须发生在实例初始化中 当前类的方法()。否则,一个 IllegalAccessError 被抛出。
因此,我觉得一些编织工具需要一些更新来满足这个 JVM 规范。 EclipseLink 静态编织工具似乎就是其中之一。
问题:
- JPA 中是否允许使用此处介绍的 final 字段构造?
- 是否有一个 JDK 9 选项来禁用对其他地方的最终字段分配的检查,而不是仅在类的实例初始化方法()中(作为临时解决方法)?
编辑:
根据 JPA 规范,JPA 中不允许使用最终字段:
实体类不能是最终的。实体类的任何方法或持久实例变量都不能是最终的。
【问题讨论】:
-
您能说是否可以在 java 9 上使用 EclipseLink(作为自动模块)?如果是,您使用的是什么版本的 EclipseLink?
标签: jpa eclipselink java-9 compile-time-weaving