Hibernate学习笔记(三)深入理解持久化对象

  • 持久化类的要求
  • 持久化对象的状态
  • 改变持久化对象状态的方法


持久化类的要求:
1、提供一个无参数的构造器:为了方便Hibernate在运行时生成代理,构造器的访问控制符至少是包可见的,即大于或等于默认的访问控制符。(private <default<protect<public)

2、提供一个标识属性:标识属性通常映射数据库表的主键。建议使用基本类型的包装类作为标识属性的类型。
3、属性的getter 和 setter方法。
4、使用非final的类:使用非final的类,这样可以让Hibernate使用CGLIG生成代理。方法都申明为public的,这样可以使用JDK的动态代理。同时避免在非final类中声明public final的方法,否则需要设置lazy="false",来明确禁用代理。
5、重写equals()和hashCode()方法:如果需要把持久化类的实例放入Set中,则应该为该持久化类重写equals()和hashCode()方法。当我们想要重用脱管实例时,该实例所属持久化类也必须重写equals()和hashCode()方法。

持久化对象的状态:
瞬态:刚new出来的对象,尚未与Hibernate Session关联,这是对象为瞬态的。瞬态的对象不会被持久化到数据库中,也不会被赋予持久化标识。如果程序失去对瞬态对象的引用,瞬态对象会被垃圾回收机制销毁。使用Hibernate Session可以将其变为持久化状态。
持久化:持久化实例在数据有拥有对应的记录,而且拥有一个持久化标识(identifier)。Hibernate会自动保存持久化对象的修改状态,保存回数据库。
脱管:曾经处于持久化状态,由于Session被关闭,变成了脱管状态。仍然可以对脱管对象进行修改,只要该脱管对象重新与Session关联,该脱管对象的改动会保存到数据库。

改变持久化对象的方法:
Serializable save(Object obj)
void persist(Object obj) :为了照顾JPA的用法习惯。还有一个用处是当我们封装一个长会话流程的时候,该方法显得尤为重要。
load() 加载持久化实例,在持久化类的配置文件中设置lazy="true"时,可以延迟加载,当访问该对象的某方法是,Hibernate才是去访问数据库。如果对象不存在,会报异常。
News n = sess.load(News.class,new Integer(pk));
get():立即访问数据库,如果不存在返回null。
update()修改持久化对象
updateOrSave()自动判断对象是否曾经持久化过,自动选则使用update()还是save()方法。
merge()将当前对象的信息保存到数据库,但是该对象不会变成持久化状态。
delete()删除持久化对象实例。











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值