解决之道

个人日记
posts - 33, comments - 1, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

[导入]Hibernate学习笔记一

Posted on 2008-07-31 15:12 阅读(130) 评论(0)  编辑  收藏
 Configuration:负债管理Hibernate的配置信息,Hibernate的入口

1、configure()方法默认会在classpath下面寻找hibernatev.cfg.xml

2、支持带参数的访问,可以指定hbm.xml,如:

File file = new File(“d:\\cfg\\hibernate.xml”);

Configuration config = new Configuration().config(file);

Session的缓存:

1)、充当蓄水池的作用,减少程序访问数据库的次数。

2)、保证缓存中的数据与数据库同步,同步的具体情况看FlushMode是什么

清理缓存是指查看缓存中的数据与数据库是否同步,不同步就发送更新语句

FlushMode.AUTOHibernate判断对象属性有没有改变,是默认的清理模式

FlushMode.COMMIT:在事务结束之前清理Session的缓存,其他任何时候都不清理缓存

FlushMode.NEVER:除非强制调用Session.flush(),或则永不清理缓存。所作的修改只限与内存

FlushMode.ALWAYS:在每一个查询语句前都调用flush()进行缓存管理,这种模式经常不必要并且低效的。

Hibernate定义并支持下列对象状态(state):

·         瞬时(Transient) - new操作符创建,且尚未与Hibernate Session 关联的对象被认定为瞬时(Transient)的。瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。 如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁。 使用Hibernate Session可以将其变为持久(Persistent)状态。(Hibernate会自动执行必要的SQL语句)

·         持久(Persistent) - 持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。 Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)。 开发者不需要手动执行UPDATE。将对象从持久(Persistent)状态变成瞬时(Transient)状态同样也不需要手动执行DELETE语句。

·         脱管(Detached) - 与持久(Persistent)对象关联的Session被关闭后,对象就变为脱管(Detached)的。 对脱管(Detached)对象的引用依然有效,对象可继续被修改。脱管(Detached)对象如果重新关联到某个新的Session上,会再次转变为持久(Persistent)(Detached其间的改动将被持久化到数据库)。 这个功能使得一种编程模型,即中间会给用户思考时间(user think-time)的长时间运行的操作单元(unit of work)的编程模型成为可能。我们称之为应用程序事务,即从用户观点看是一个操作单元(unit of work)

立即检索:

         立即检索的配置文件标识符为lazy=”false”,表示Hibernate在数据库中取得字段值组装好一个对象后,会立即再从数据库此对象多关联的对象,如果这个关联的对象还有关联对象,则再组装此关联对象。

          一对多和多对一关联对象则不适合立即检索。

延迟检索:

      立即检索的配置文件标识符为lazy=”true”,就是需要用到时才会去去被关联的对象。

预先抓取指的是Hibernate通过select语句使用outer join来获得对象的关联实例或者关联集合。

Hibernate2.x版本:outer-join=”true”

Hibernate3.x版本:fetch=”join” 

<one-to-one name="cer" class="com.kissjava.Certificate" fetch="join" cascade="all"></one-to-one>1

<many-to-one name="team" column="team_id" class="com.kissjava.Team" fetch="join"></many-to-one>2

1)一个一对一关联的对象属性,名为cer,在得到Student对象时,采用预先抓取得到cer对象,并且级联为all,说明Student的增加、删除及修改操作都会影响到cer对象。

2)一个多对一关联的对象属性,名为team,在Student表中通过team_idteam对象发生关联,team的实体类是Team,在取得Student实例时,使用预先抓取得到team对象。



枯宽 2008-04-10 08:49 发表评论

文章来源:http://www.blogjava.net/kissjava/archive/2008/04/10/191727.html

只有注册用户登录后才能发表评论。


网站导航: