持久化类应该初始化实例变量集合

在我的Hibernate类中,应该初始化实例集合

public class Basket { private List items = new ArrayList(); ...getters and setters... } 

或者未经注册

 public class Basket { private List items; ...getters and setters... } 

它对Hibernate有什么不同吗? 我遇到了这个Hibernate文档 ,它初始化了他们的HashSet,但我经常看到他们没有初始化。

从Hibernate的persistent collection文档:

由于底层关系模型,集合值属性不支持空值语义。 Hibernate不区分空集合引用和空集合。

而……

当你通过调用persist()使实例持久化时,Hibernate实际上会用Hibernate自己的Set实现替换HashSet。

这些“非null集合”和“持久”与“非持久”语义有时会被开发人员迷失。 为了简化Hibernate对象,我更喜欢:

  • 始终使用java.util实现初始化所有Collections
  • 始终编​​码到Collection接口

使它习惯于Hibernate对象Collection永远不会为NULL,并避免在将Hibernate对象Collection转换为无效实现的上述文档中提到的陷阱。

像在第一个代码块中那样进行静态初始化会减少对空检查的需求,如果你知道在大多数用例中你将使用该集合,那么它是有意义的。

另一方面,如果很少使用集合,则推迟初始化直到实际需要使用它才更有意义。

你应该初始化它。 即使Hibernate稍后在哪里初始化它,即使它没有内容(我不确定它总是如此),你应该初始化它以确保它总是连贯地不为空。

在提供的示例中,您可以看到Cat没有明确的无参构造函数,因此他们必须在声明时初始化集合。 很可能当你看到它未初始化时,还有一个明确的无参数构造函数,以后再初始化它。

我不能用任何专业文档备份它,但这是我对此事的看法。 我认为你有两条可能的道路要遵循。

仅限DTO

第一个依赖于模型bean是普通的DTO,仅用于数据持久性,不执行逻辑。 在这里,您可以保留未初始化的POJO字段 ,因为在您通过Session检索持久对象之前,Hibernate会自动完成。 我相信你已经知道,Hibernate将静默地将所有集合包装到它自己的包装器中,这是内部持久性机制所需要的。

适当的模型类

第二种方法使POJO更进一步。 在这种情况下,您可以在getter和setter方法中执行一些逻辑。 这并不是那种不常见的场景,毕竟MVC完全可以接受它,并且经常会发现自己需要为它们添加一些代码。 例如 – 在调用setter方法时记录一些信息,例如:

 public void setItems(List items){ LOGGER.info("Setting '{}' new items", items.size()); this.items = items; } 

在这种情况下,人们可能会遇到麻烦,因为据我所知,此时Hibernate不会对集合进行初始化。 在那种情况下,显式初始化会更好。

最后的评论:我不是Hibernate的专家,我也不知道4.x中是否有任何变化,但我知道我在某些时候忍受了这个问题。