为什么JPA实体中的属性不允许"公开"?

dea*_*mon 6 java jpa java-ee

JPA 2.0规范说,第22页:

类的实例变量必须是私有的,受保护的或包可见性,与是否使用字段访问或属性访问无关.使用属性访问时,属性访问器方法必须是公共的或受保护的.

为什么不允许公共访问?

Cow*_*wan 10

对于公共字段,代理无法可靠地工作 - 如果有人直接访问字段,那么持久性框架没有简单的方法来拦截该调用并且(比方说)初始化包含对象,如果它是代理.

如果无法进行字段访问,则可以在代理对象上生成合成getter方法,以拦截方法调用并执行任何所需的"幕后"工作.

  • 我应该更清楚,但我后来确实说过"没有_simple_方式".在某种程度上,JPA规范是不同框架之间的"最低共同点" - 要求框架使用AOP,或者增强_calling_类(因为我收集DataNucleus)对于JPA规范来说肯定会过多.我想,其他持久性引擎欢迎提供JPA指定的功能,但要求JPA规范合规性的字段访问拦截将是繁重的. (3认同)
  • 同意Martin K,字节码增强也解决了这个问题 - 请参阅其他答案 (2认同)

Dat*_*eus 5

使用 DataNucleus 作为 JPA 提供程序,您可以使用公共字段,但是您需要将访问这些字段的任何类标记为“持久性感知”(请参阅​​ DataNucleus 文档),以便可以增强它们以适应这一点