技术开发 频道

Hibernate快速入门教程


【IT168 技术文档】
  四、关键概念的理解

  在使用Hibernate进行开发的时候有几个概念在我看来是必须理解的,否则在开发的时候会遇到很多问题而摸不着头脑。
  1.Lazy loading,懒加载(延迟加载)
  这个技术在很多地方被应用,比如Eclipse的插件管理也是用的延迟加载。在Hibernate中,所谓延迟加载就是返回一个POJO但是某些数据(往往是实体类型或者Set类型)并没有被真正的被填充,直到POJO的某个字段真正被引用的时候才从数据库中读取相应的数据来填充POJO中的字段。这样就能有效的避免很多不必要的数据库操作,因为POJO的有些数据我们并不需要,而且数据库操作是很费时间的。在Hibernate2中,默认是非延迟加载的,而在Hibernate3中,默认就是延迟加载了。
如果使用了延迟加载,那么在读取数据的时候有一个问题必须注意,那就是在数据真正被加载之前,Session不能被关闭。你可以回头看一下代码片段5,我在构造函数里面open了session以后就没有关闭这个session,所以我在使用的时候没有什么问题,但这样总占着数据库连接也不好,用好了应该及时关闭给别人用。我上文给的例子中没有关闭Session的代码,要加的话给DAO加一个方法调用Session.close(),然后在代码片段1中的return之前调用这个方法就行了。
Hibernate的延迟加载机制远不是这么简单,但是普通的应用没有必要去深究这些东西,了解这么多就够了。
  2. Object lifecycle,对象生命周期
  在Hibernate中,对象分为三种状态,Transient(自由状态)、Persistent(持久状态),Detached(游离状态),下面我分别解释一下。
  1、自由状态:所谓自由状态就是说这个对象是自由的,与Hibernate无关,比       如:
    Student student = new Student();
        student.setId("0361095");
                这里的student就是一个普通的对象与hibernate无关,称为自由状态。
  2、持久状态:所谓持久状态就是指对象和数据库中的数据(持久状态的数据)       有关联,也就是说对象被Hibernate所管理了,比如:
  session.save(student);
  这样student对象就从自由状态变为持久状态了。持久状态的对象在Session       与数据库中的数据进行同步时(比如commit)会把数据更新到数据库。而         其他状态的则不会。我觉得可以这样来理解持久状态,可以看成Hibernate       也拥有一份对象的引用,那么如果你对持久状态对象的属性进行更改的话,       Hibernate看到的对象的状态也更改了,而Hibernate所看到的对象和数据       库中的数据是等价的。也正是这样,Hibernate才实现了Object/Relation       的映射。类似的,load和get方法也一样会获取Persistent状态的对象。
  3、游离状态:每次调用Session.close以后,所有跟这个session有关的处于
Persistant的对象就变成了游离状态。也许你要问Detached和Transient有什么区别。其实从我给的例子来说看不出什么区别,因为我这里ID是给定的,而真正开发的时候ID往往是自增的,那么Transient的对象是没有ID    的,当save了以后就有了,显而易见Detached的对象也是有ID,只不过这个对象已经和Hibernate脱离了关系。但是游离状态的对象仍然和数据库    中的记录有一定联系,至少游离状态的对象知道数据库中有条记录的ID为xxx。从这一点上来讲,游离状态是可以自己创造出来的,只要你知道数据库中的主键信息。
  在使用Hibernate开发的时候要分清楚这三种状态,否则很容易出错。比如不能去save一个游离状态的对象,不能去update一个自由状态的对象等等。

五、结束语

  我要讲的就这么多,这篇文章不是详细介绍Hibernate,我只是总结了自己学习和使用Hibernate的一些感受和经验,希望能给没有用过Hibernate的开发者一个上手的指引。如果你看完了这篇文章仍然满头雾水,无从下手的话,我只能向你表示歉意,浪费你的时间了。不管怎样,我强烈推荐一本书《深入浅出Hibernate》,这本书既能作为学习的教程,也能作为日后的查询用书,相当实用。

0
相关文章