hibernate学习

持久化对象操作:
session的缓存
session的save()方法持久化一个对象时,该对象会被放入缓存中。
session的load()方法会先判断对象是否在缓存中,再去数据库中查询。
session的close()方法会清空缓存。
当session调用commit()方法时,首先清理缓存,然后向数据库提交事务。所以当你连续对对象的一个属性作操作时,只会执行一条update语句
session的flush()方法会清理缓存,执行一系列的SQL语句,但不会提交事务

hibernate中java对象的状态
transient瞬时,new创建,没有被持久化,不处于缓存中
persistent持久化,已经持久化,加入到缓存中
detached游离,已经持久化,不处于缓存中

new->trasient
get(),load(),find(),iterate()->persistent
(trasient)save,saveOrUpdate()->persistent
(persistent)delete()->trasient
(persistent)close(),evict(),clear()->detached
(detached)update(),saveOrUpdate(),lock()->persistent
(detached)delete()->trasient

session的CRUD操作
save:把瞬时对象变为持久化对象。
hibernate使用oid维持表与实体间的关系,当对象处于持久化状态时,不允许对oid的修改操作。
当save方法操作游离态对象时,会重新插入一条语句

update:把游离态对象转化成持久化对象。
把对象重新放入到缓存中,变为持久化对象。
update只有在清理缓存的才会执行,所以当你连续对对象的一个属性作操作时,只会执行一条update语句
当session已经load了oid为1的对象,此时把oid为1游离态对象update,则出错。



出现的问题:  
Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
java通过jdbc连接sqlserver和oracle时出现这个异常。虽然抛出这个异常,但对整个应用没有影响。这个异常产生的原因是jar包的版本不对。连接oracle10g的jdbc用ojdbc6.jar(1942k),连接sqlserver2008用sqljdbc.jar(570k),而不用sqljdbc4.jar(567k)。postgres用postgresql-8.2-504.jdbc3.jar。


你可能感兴趣的:(Hibernate)