【问题标题】:Why JPA requires Entity classes to be non-final & fields non-final为什么 JPA 要求实体类是非最终的和字段是非最终的
【发布时间】:2019-04-08 13:18:39
【问题描述】:

正在阅读 JPA here。 Entity 类的两个要求是

  1. 不得将类声明为 final。没有方法或持久实例变量必须声明为 final。
  2. 该类必须具有公共或受保护的无参数构造函数。
  3. 必须将持久实例变量声明为私有、受保护或包私有。

很想知道为什么需要这些条件?

【问题讨论】:

    标签: jpa


    【解决方案1】:
    1. 该类不得声明为 final。没有方法或持久实例变量必须声明为 final。

    JPA 实现在您的实体前使用代理来管理例如:延迟加载。由于 final 类无法扩展,因此无法构建代理。

    Hibernate 的一些实现可以持久化最终类,但它会影响性能more info

    1. 该类必须具有公共或受保护的无参数构造函数。

    这些框架和其他框架为了创建新对象使用 ```Class.newInstance()`` 这就是为什么需要无参数构造函数的原因。

    1. 永久实例变量必须声明为私有、受保护或包私有。

    只能通过访问器或业务方法访问,从而允许在代理中进行拦截。

    【讨论】:

    • 您好,谢谢!当他们在同一个文档中说“Java 编程语言基本类型”时,您还能说出他们的意思吗?我认为它们可能意味着原始数据类型,但不确定。
    • 是的,在这种情况下,我想说的不仅仅是基本的对象包装器。例如:整数而不是 int。但是,是的,基本上,如果您使用 Map 来映射关系,则键必须是基本类型、实体或可嵌入的。如果您认为我的回答没问题,您可以检查一下:stackoverflow.com/help/someone-answers
    【解决方案2】:

    原因是(至少其中一些):

    1. JPA 提供者需要动态创建实体实例。如果类将包含唯一接受任意参数的构造函数,则 JPA 提供程序无法计算出这些参数的值。这就是为什么它必须有一个无参数的构造函数。
    2. JPA 实现处理实体类的持久实例。这就是类、方法和变量不能是 final 的原因。
    3. 因为您不想直接从外部访问变量,为了保留encapsulation - 这是一个面向对象的原因。另一个原因是许多持久性框架都有一个 getter/setter 方法来识别 POJO“属性”。

    【讨论】:

      猜你喜欢
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多