5.5 深入理解持久化对象:(5.5.1)持久化类的要求

Hibernate采用低侵入式设计,这种设计对持久化类几乎不作任何要求。也就是说,Hibernate操作的持久化类基本上都是普通、传统的Java对象(POJO)。对于这种Java类,程序开发中可以采用更为灵活的领域建模方式。

虽然Hibernate对持久化类没有太多的要求,但我们还是应该遵守如下规则:

① 提供一个无参数的构造器。

所有的持久化类都应该提供一个无参数的构造器,这个构造器可以不采用public访问控制符。提供了无参数的构造器,Hibernate就可以使用Constructor.newInstance( )来创建持久化类的实例了。通常,为了方便Hibernate在运行时生成代理,构造器的访问控制修饰符至少是包可见的。

② 提供一个标识属性。

标识属性通常映射数据库表的主键字段。这个属性可以叫任何名字,其类型可以是任何的基本类型、基本类型的包装类型、java.lang.String或者java.util.Date。如果使用了数据库表的联合主键,甚至可以用一个用户自定义的类,该类拥有这些类型的属性。当然也可以不指定任何标识属性,而是在映射文件中直接将多个普通属性映射成一个联合主键,但通常不推荐这么做。

③ 尽量避免使用基本数据类型作为标识属性的类型。

因为Hibernate建议使用可以为空的类型来作为标识属性的类型,因此应该尽量避免使用基本数据类型。

④ 为持久化类的每个属性提供setter和getter方法。

因为Hibernate默认采用属性方式来访问持久化类的属性。

⑤ 使用非final类。

在运行时生成代理是Hibernate的一个重要功能。如果持久化类没有实现任何接口的话,Hibernate使用CGLIB生成代理,该代理对象是持久化类子类的实例。如果使用了final类,则无法生成CGLIB代理,也就无法进行性能优化。还有一个可选的策略,让Hibernate持久化类实现一个所有方法都声明为public的接口,此时将使用JDK的动态代理。同时应该避免在非final类中声明public final的方法。如果必须使用一个有public final方法的类,你必须通过设置lazy="false"来明确地禁用代理。

⑥ 重写equals( )和hashCode( )方法。

如果需要把持久化类的实例放入Set中( 当需要进行关联映射时,推荐这么做 ),则应该为持久化类重写equals()和hashCode()方法。实现这两个方法最显而易见的方法是比较两个对象标识符的值。如果值相同,则两个对象对应于数据库表的同一行,因此他们是相等的(如果都被添加到Set中,则在Set中只有一个元素)。遗憾的是,对采用自动生成标识符的对象不能使用这种方法。Hibernate仅为那些持久化对象指定标识值,一个新创建的实例将不会有任何标识值。因此如果一个实例没有被保存过,但它又确实在一个Set中,保存它将会给这个对象赋一个标识值。如果equals()和hashCode()是基于标识值实现的,则其hashCode返回值会发生改变,浙江违反Set的规则。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值