[学习]Hibernate 3.2学习笔记之四

理解Hibernate中的持久化对象

虽然hibernate采用了低侵入式的设计,我们设计持久化类的时候还是要遵循以下原则:

 

提供无参的构造器。

提供一个标志属性。

非final的类。

重写eqauls()和hashCode()方法。

 

hibernate持久化对象支持如下几种状态:

 

瞬态:对象由new关键字创建,,没有和Session关联。此时对象不会被持久化到数据库,也不会被赋予持久化标志。使用Session可以将其转化成持久化状态。

持久化:持久化的实例在数据库中一对应的记录,并拥有持久化标志。持久化实例可能是刚刚保存,也可能是刚刚加载的,但它必须与特定的Session相关联,此时对该实例的修改会转换成对数据库的修改。

脱管:某实例曾经是持久化状态,但随着Session的关闭,它变成脱管状态。脱管状态的实例再次关联了Session后又可以变成持久化状态。

 

下图为Hibernate持久化实例的状态演化图

 

Hibernate Session API:

 

下列方法将瞬态对象转换成持久化对象

public Serializable save(Object object):将obj对象持久化,即保存到数据库

public void persist(Object object):将obj对象持久化,即保存到数据库

public Serializable save(String entityName, Object object):将obj对象持久化,即保存到数据库,指定主键值
public void persist(String entityName, Object object):将obj对象持久化,即保存到数据库,指定主键值

save()和persist()方法的区别在于,使用save()方法保存持久化对象时,该方法返回该持久化对象的标志属性值(主键值);但使用persist()保存时,不返回任何值。save()方法会立即执行insert操作,而persist()方法保证当它在事务外部被调用时,不立即执行insert操作。

 

下列方法可以加载一个持久化对象

public Object get(Class clazz, Serializable id)

public Object load(Class theClass, Serializable id)

类似的,get()方法和load()方法的区别在于,get()方法会立即访问数据库,当要加载的数据不存在返回null;而load方法具有延时加载的功能,不会立即访问数据库,当数据不存在时可能返回一个代理对象。

 

下面的方法用于保存对脱管对象的修改

public void update(Object object)
public Object merge(Object object)
public void saveOrUpdate(Object object)

 

update()方法和merge()方法的区别在于使用update()方法修改的对象会再次变成持久化状态,而merge()方法不会。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值