在我的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,但我经常看到他们没有初始化。
答案 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中是否有任何变化,但我知道我在某些时候遇到了这个问题。