当前位置: 首页 > 面试题库 >

在JPA实体getter中初始化字段是否是一种好习惯?

养星汉
2023-03-14
问题内容

在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初始化为空,持久数据将不会更改,但是仍然,我们正在修改对象,因此持久性提供程序在刷新持久性上下文时可能会产生一些副作用。我们有什么风险?可能是便携性?


问题答案:

我强烈建议不要对ORM实体中的属性进行延迟初始化。

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



 类似资料:
  • 问题内容: 在一对多JPA关联中,将空关系初始化为空集合是否被视为最佳实践?例如。 在上面的示例中,最好将默认值定义为空吗?优缺点都有什么? 问题答案: JPA本身并不关心集合是否已初始化。当使用JPA从数据库中检索订单时,JPA将 始终 返回带有非空OrderLine列表的Order。 原因:因为一个订单可以有0行,1行或N行,并且最好用一个空的,一个大小或N个大小的集合进行建模。如果集合为空,

  • 问题内容: 谁能解释以下程序的输出?我认为构造函数要在实例变量之前初始化。因此,我期望输出为“ XZYY”。 问题答案: 正确的初始化顺序是: 如果该类先前尚未初始化,则按文本顺序的静态变量初始化程序和静态初始化块。 构造函数中的super()调用,无论是显式的还是隐式的。 实例变量初始化程序和实例初始化块,按文本顺序。 super()之后构造函数的其余主体。

  • 问题内容: 我知道关键字存在于Java中。但是我不记得看到使用它的代码。可能我正在使用异常,并在本可以使用的地方登录。在Java中使用关键字是否是一种好习惯? 编辑 :我知道断言通常是一个好习惯。我的问题是,更准确地说,如果在Java中断言的BKM是使用关键字而不是使用异常,日志记录和其他技术。 问题答案: 不使用断言的主要原因是因为默认情况下未启用断言。因此,如果您的条件足够重要而需要断言,则不

  • 我有这样的代码: 当我们没有任何其他getInstance的静态方法时,是否初始化了此单例惰性?据我所知,类只在某些情况下初始化,比如: 类的实例是使用new()关键字或使用类的反射创建的。forName(),它可能在Java中引发ClassNotFoundException (Surce:http://javarevisited.blogspot.com/2012/07/when-class-l

  • 问题内容: 如果我在代码中使用如下语句 它将数组初始化为特定的东西吗?(例如0)我似乎记得此文件记录在某处,但我不确定要搜索什么。 问题答案: JLS说,在15.10数组创建表达式中 […]创建具有指定长度的一维数组,并将数组的每个组件初始化为其默认值 在4.12.5变量的初始值处表示: 对于type ,默认值为零,即。

  • 所以我在使用DerbyDB,并建立了一些实体。我有一个,它被用作某些实体的超类()。更具体地说,我有一个超类和3个子类,即、和。现在我有了一个不同的实体,比如说,它应该引用(作为其字段之一)它的所有者。所以我创建了一个名为的字段。我得到的错误是: 有变通办法吗?