Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPA实体getter中初始化字段是一种好的做法吗?_Java_Jpa - Fatal编程技术网

Java 在JPA实体getter中初始化字段是一种好的做法吗?

Java 在JPA实体getter中初始化字段是一种好的做法吗?,java,jpa,Java,Jpa,在POJO Java bean中,这样的代码可能是有益的,特别是对于集合: 类POJO{ 私人收藏; 公共集合getCol(){ if(col==null) col=新集合(); 返回列; } } 使用POJO的代码可以调用POJO.getCol().isEmpty(),而无需额外的空检查,从而使代码更清晰 假设POJO类是一个JPA实体,这样做是否仍然安全?通过将集合从null初始化为空,持久性数据不会被更改,但我们仍在修改对象,因此持久性提供程序在刷新持久性上下文时可能会运行一些副作用。我

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

类POJO{
私人收藏;
公共集合getCol(){
if(col==null)
col=新集合();
返回列;
}
}
使用
POJO
的代码可以调用
POJO.getCol().isEmpty()
,而无需额外的空检查,从而使代码更清晰


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

我不认为这是一个好的实践,更多的是因为一些很少需要优化。如果某个集合非常难以创建,那么延迟初始化可能是有意义的。相反,您可以在声明时对其进行初始化(至少在我看来,代码更干净):

类POJO{
私有集合col=new SomeCollection();
公共集合getCol(){
返回列;
}
}

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

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

但我不推荐你在getter中的做法

在我个人看来,上述“规则”也应该用于对象的内部表示。因此,您可以更好地使用:

class POJO {
    private Collection<X> col  = new SomeCollection<X>();
类POJO{
私有集合col=new SomeCollection();

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

延迟初始化是非常常见的,而且很好做

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

专业的

  • 延迟初始化通常效率更高,它延迟了创建值的成本,这些值可能永远不会被需要或替换为其他值。这在JPA中非常常见,在JPA中,从数据库读取现有对象,并始终替换它们的值
  • 它允许空值具有含义,这在布尔值中更为典型,其中空值表示默认值,默认值是基于创建时不知道的其他内容惰性分配的
  • 如果该值是暂时的或以某种方式为空,则延迟初始化可以防止空指针
骗局

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

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


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

谢谢,这正是我一直在寻找的东西-一个被烧焦的人发出的警告。我有一种预感,它可能是错的,只是我想确定我不是在幻想。当然。我们花了两天的时间跟踪该对象变脏的地方。它是我觉得很痛苦。
class POJO {
    private Collection<X> col  = new SomeCollection<X>();