持久化类应该初始化实例变量集合
在我的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
在这种情况下,人们可能会遇到麻烦,因为据我所知,此时Hibernate不会对集合进行初始化。 在那种情况下,显式初始化会更好。
最后的评论:我不是Hibernate的专家,我也不知道4.x中是否有任何变化,但我知道我在某些时候忍受了这个问题。
- Hibernate:如何使用CONCAT和GROUP_CONCAT
- 带有ManyToOne的JPA Composite键获取org.hibernate.PropertyAccessException:无法通过reflection设置器设置字段值
- Hibernate Mapping – 使用关联表连接两个表 – 但是有一个扭曲
- UnknownEntityTypeException:无法找到persister(Hibernate 5.0)
- 我需要这个错误的帮助:java.lang.NoSuchMethodError
- 如何强制Hibernate 3.3或3.5使用CGLib而不是Javassist?
- [Ljava.lang.Object; 无法施展
- 如何在hibernate中的多对一映射上定义反级联删除
- org.hibernate.LazyInitializationException:无法初始化代理 – 没有Session,加载un fois