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

时间:2011-12-21 12:41:32

标签: java hibernate collections

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

public class Basket {
    private List items = new ArrayList();

    ...getters and setters...
}

或未经注册的

public class Basket {
    private List items;

    ...getters and setters...
}

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

4 个答案:

答案 0 :(得分:8)

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

另一方面,如果很少使用该集合,则在实际需要使用它之前推迟初始化会更有意义。

答案 1 :(得分:6)

来自Hibernate的persistent collection文档:

  

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

而且......

  

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

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

  • 始终使用Collections实施
  • 初始化所有java.util
  • 始终编码为Collection接口

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

仅限DTO

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

正确的模型类

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

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

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

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