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

Dan*_*nny 12 java collections hibernate

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

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

    ...getters and setters...
}
Run Code Online (Sandbox Code Playgroud)

或者保持未经注册

public class Basket {
    private List items;

    ...getters and setters...
}
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*dge 8

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

另一方面,如果很少使用集合,那么推迟初始化直到您确实需要使用它更有意义.


Dan*_*ruz 6

从Hibernate的persistent collection文档:

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

而......

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

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

  • 总是Collectionsjava.util实现初始化所有
  • 总是代码到Collection接口

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