Hibernate之领域模型

来源:互联网 发布:雪肌精淘宝旗舰店 编辑:程序博客网 时间:2024/04/24 07:54

实现领域模型

 


如果用POJO实现领域模型,POJO最好是一个标准的JavaBean,它不应该依赖于正交的Java API, 但最好还是实现Serializable(可序列化)。当对象被存储在一个HttpSession中,或者用RMI按值传递时,就需要序列化,这可能发生在hibernate应用中。Hibernate和JPA要求每个持久化类都有一个无参构造函数,因为hibernate在这个构造函数上使用java Reflection API调用持久化类来实例化对象。构造函数可以是非公共的,但必须至少是包可见的。
实现POJO关联
用属性表达POJO类之间的关联,并用访问方法在运行时从一个对象到一个对象进行导航。
如例,一对多自关联并双向导航:
 
为了允许关联的双向导航,你需要两个属性。parentCategory字段实现关联的单值端,并且被声明为Category类型。多值端,由
childCategories字段实现,必须是集合类型。由于不允许重复,就选择了Set(集),并把实例变量初始化为HashSet的一个新实例。
Hibernate需要用于集合类型属性的接口,因此必须使用java.util.Set或java.util.List,而不是HashSet。这与实体中集合的JPA规范的要求相一致。不管怎样,这是集合接口编程的一个好的实践。
管理两个Category实例之间的链接,比在数据库字段中设置外键值更难。依据我们的经验,开发人员经常不知道从一个包含双向引用的网络对象模型中所产生的这种复杂性。每当在父Category和子Category之间创建一个链接时,需要两个动作:
  • 必须设置子类的parentCategory,有效地破坏子类和它的旧父类之间的关联(任何子类都只能有一个父类)。
  • 子类必须被添加到这个新的父Category的在Categories集合中。

给这些操作进行分组,添加一种方便的方法是个好主意。这样允许重用,帮助确保正确性,并且最终保证数据的完整性:

 

 

应该始终对关联提供这样的操作分组,如果你把它与关系数据库中外键的关系模型相比较,就很容易明白网络和指针模型如何使一个简单的操作变得复杂:不用声明约束,而是需要过程性代码来保证数据的完整性。由于想要addChildCategory()成为子类中唯一外部可见的存储器方法(可能还要加上removeChildCategory()方法),你可以让setChildCategories()方法为私有,或者删除它,并使用直接的字段访问进行持久化。

如例,多对多双向导航:

Category到Item脚手架代码

 

Item到Category脚手架代码,addCategory()方法处理多对多关联的完整性

 

 


 

还要注意一点:

 

你可以用hibernate持久化一个没有实现任何接口的final类,但是你不能使用代理来延迟关联加载,这会限制你进行性能优化的选择。

你也应该避免在非final类中声明public final的方法。如果你想使用一个有public final方法的类,你必须通过设置lazy="false"来明确地禁用代理.

 

 

原创粉丝点击