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