我有一些像这样声明为 final 的 JPA 注释字段:
@Column(name = "SOME_FIELD", updatable = false, nullable = false)
private final String someField;
当实体插入数据库时,这些字段存储在数据库中。它们无法进一步更新。对于 Java 编程语言,这些字段可以被认为是最终的。
使用 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 中是否允许诸如此处介绍的最终字段构造?
- 是否有 JDK 9 选项可以禁用对其他地方的最终字段分配的检查,而不仅仅是在类的实例初始化方法()中(作为临时解决方法)?
编辑:
根据 JPA 规范,JPA 中不允许使用最终字段:
实体类不能是最终的。实体类的任何方法或持久实例变量都不能是最终的。