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

来源:互联网 发布:微信小店 源码 编辑:程序博客网 时间:2024/04/30 15:40

理解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()方法不会。

原创粉丝点击