【问题标题】:Is it good practice to initialize fields inside a JPA entity getter?初始化 JPA 实体 getter 中的字段是一种好习惯吗?
【发布时间】:2011-10-17 08:44:32
【问题描述】:

在 POJO Java bean 中,这样的代码可能是有益的,尤其是对于集合:

class POJO {
    private Collection<X> col;

    public Collection<X> getCol() {
        if (col == null)
           col = new SomeCollection<X>();

        return col;
    }
}

这使得使用POJO 的代码无需额外的空检查即可调用pojo.getCol().isEmpty(),从而使代码更清晰。

假设POJO 类是一个JPA 实体,这样做仍然安全吗?通过将集合从 null 初始化为空,持久性数据不会被更改,但我们仍在修改对象,因此持久性提供程序可能会在刷新持久性上下文时运行一些副作用。我们冒什么风险?也许是便携性?

【问题讨论】:

    标签: java jpa


    【解决方案1】:

    我不认为这是一个好的做法,更像是一些很少需要的优化。如果 SomeCollection 创建起来非常繁重,那么延迟初始化可能会有意义。相反,您可以在声明时对其进行初始化(至少对我来说代码更清晰):

    class POJO {
        private Collection<X> col  = new SomeCollection<X>();
    
        public Collection<X> getCol() {
            return col;
        }
    }
    

    在刷新或可移植性问题中没有副作用,并且您减少了一次空检查。

    【讨论】:

      【解决方案2】:

      我强烈反对对 ORM 实体中的属性进行延迟初始化。

      我们在使用 Hibernate 对实体属性进行延迟初始化时遇到了一个严重问题,因此我强烈反对这样做。我们看到的问题是在我们发出搜索请求时发生的保存。这是因为在加载对象时,该属性为空,但当调用 getter 时,它会返回延迟初始化的对象,因此休眠(正确地)认为该对象是脏的,并会在发出搜索之前将其保存。

      【讨论】:

      • 谢谢,这就是我一直在寻找的东西——来自被烧伤的人的警告。我有一种预感,这可能是错误的,只是我想确保我没有幻想。
      • 当然。我们最终花了 2 天时间追踪物体变脏的地方。很痛苦。
      【解决方案3】:

      一般来说,最好使用空集合或 null(对于集合的字段)。

      但我不推荐你在getter中做的方式。

      在我个人看来,上面的“规则”也应该用于对象的内部表示。所以你会做得更好:

      class POJO {
          private Collection<X> col  = new SomeCollection<X>();
      

      无论如何,如果你想让它更节省,你需要保护你更新col引用的每一种方式。但在 JPA 应用程序中,这应该是一个非常原始的用例。

      【讨论】:

        【解决方案4】:

        延迟初始化很常见,很好做。

        在构造函数或变量定义中与初始化存在权衡:

        专业版

        • 延迟初始化通常更有效,它延迟了创建值的成本,这可能永远不需要或被其他值替换。这在 JPA 中很常见,从数据库中读取现有对象,并且总是替换它们的值。
        • 它允许空值具有意义,这在布尔值中更为典型,其中 null 表示默认值,该默认值是基于创建时未知的其他内容而延迟分配的。
        • 如果值是瞬态的或以某种方式为空,则延迟初始化可以防止空指针。

        骗子

        • 如果直接访问该字段,您仍然可以获得空指针。
        • 在变量定义中设置默认值更加清晰。
        • 如果对象同时使用,延迟初始化可能是并发问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-28
          • 2011-03-02
          • 1970-01-01
          • 2012-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多