hibernate工作机制

   Hibernate简介:

   在今日的企业环境中,把面向对象的软件和关系数据库一起使用可能是相当麻烦、浪费时间的。Hibernate是一个面向Java环境的对象/关系数据库映 射工具。对象/关系数据库映射(object/relational mapping (ORM))这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。

    Hibernate不仅仅管理Java类到数据库表的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。

    Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。对于以数据为中心的程序来说,它们往往只在数据库中使用存储过 程来实现商业逻辑,Hibernate可能不是最好的解决方案;对于那些在基于Java的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应 用,Hibernate是最有用的。不管怎样,Hibernate一定可以帮助你消除或者包装那些针对特定厂商的SQL代码,并且帮你把结果集从表格式的 表示形式转换到一系列的对象去。

 

 

Hibernate结构图:

 

Query :在数据库上执行查询并控制查询如何执行。查询语句使用HQL或者本地数据库的SQL方言编写
      提供了灵活多样的查询机制:HQL , Criteria Queries, Native SQL Queries
            Query query = session.createQuery(“from User”)
Lifecycle :提供了一些回调方法,可以让持久化对象在save或load之后,或者在delete或update之前进行必要的初始化与清除步骤。
Validatable :该接口是合法性检查的回调.持久化类需要在保存其持久化状态前进行合法性检查
Interceptor :提供从session到你的应用程序的回调方法,让你的程序可以观察和在持久化对象保存/更改/删除或者装载的时候操作它的属性
UserType :创建属于自己的值类型 。
Configuration:负责管理Hibernate 的配置信息.Hibernate 运行时需要
    获取一些底层实现的基本信息,其中几个关键属性包括:
    1、数据库URL
    2、数据库用户
    3、数据库用户密码
    4、数据库JDBC驱动类
    数据库dialect,用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现,如Hibernate数据类型到特定数据库数据类型的映射等。
    当然,还有指定Hibernate映射文件的位置。(*.hbm.xml)。
Hibernate配置有两种方法:
    属性文件配置。默认文件名是hibernate.properties。调用代码:
       Configuration config = new Configuration();
XML文件配置。默认文件名是hibernate.cfg.xml。
    Configuration config = new Configuration().configure();



Hibernate核心-1:O/R Mapping

 

简单地说,对象-关系映射就是Java应用中的对象到关系数据库中表的自动和透明的持久化,使用元数据描述对象与数据库间的映射.本质上,ORM的工作是将数据从一种表示转换为另一种。
     提高生产率:与持久性有关的代码可能是Java应用中最乏味.Hibernate去掉了很多让人心烦的工作,让你可以集中更多的精力到业务问题上.不论你喜欢哪种应用开发策略,使用Hibernate和适当的工具将会减少大量的开发时间。
o    可维护性:
         减少代码,重构方便,提高可维护性.ORM是对象和关系数据库之间的缓冲区,将他们很好的隔离.
o       更好性能:ORM软件的实现人员可能有比你更多的时间来研究性能优化问题.
o       厂商独立性:
      ORM抽象了你的应用使用下层SQL数据库和SQL方言的方式.如果工具支持许多不同的数据库,那么这会给你的应用带来一定程度的可移植性.使用ORM开 发跨平台的应用通常更容易.如:开发者使用一个轻量级的本地数据库进行开发但实际产品需要配置在一台不同的数据库上

Hibernate核心-2:工厂模式

SessionFactory(会话工厂)
应用程序从SessionFactory里获得Session.通常整个应用只有一个会话工厂.如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂.会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据.它也保存了在一个工作单元中读入的数据并且可能在以后的工作单元中被重用(只有类和集合映射指定了使用这种二级缓存).
SessionFactory sessionFactory = config.buildSessionFactory()

Session(会话)
该接口是Hibernate使用最多的接口.Session不是线程安全的,它代表和数据库的一次操作. 通过SessionFactory打开,在工作完成后需要关闭.它的概念介于Connection和Transaction之间的已经装载对象的缓存或集合的一个独立工作单元。
我们有时也称Session为持久化管理器,因为它是与持久化有关的操作的接口。
会话并不是线程安全因此应该被设计为每次只能在一个线程中使用. 会话与Web层的HttpSession没有任何关系。
   Session session = sessionFactory.openSession();

Transaction
   事务将应用代码从底层的事务实现中抽象出来, 一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)—允许应用通过一组一致的API控制事务边界。这有助于Hibernate应用在不同类型的执行环境或容器中的可移植性。
   Transaction trans = session.beginTransaction ();

Hibernate核心-3:持久化对象状态

瞬时(Transient)对象:使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。
持久化(Persist)对象:持久实例是任何具有数据库标识的实例。它有持久化管理器Session统一管理,持久实例是在事务中进行操作的——它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。
离线(Detached)对象:Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。

Hibernate最佳实践:

1.使用Configuration装载映射文件时,不要使用绝对路径装载。最好的方式是通过getResourceAsStream()装载映射文件,这样Hibernate会从classpath中寻找已配置的映射文件。
2.SessionFactory的创建非常消耗资源,整个应用一般只要一个SessionFactory就够了,只有多个数据库的时候才会使用多个SessionFactory。
3.在整个应用中,Session和事务应该能够统一管理。(Spring为Hibernate提供了非常好的支持)
将所有的集合属性配置设置为懒加载(lazy=”true”)。在hibernate2.x版本中,lazy默认值是“false”,但hibernate3.x已经将lazy的默认改为“true”了。
4.在定义关联关系时,集合首选Set,如果集合中的实体存在重复,则选择List(在定义配置文件时,可以将List定义为bag),数组的性能最差。
5.HQL子句本身大小写无关,但是其中出现的类名和属性名必须注意大小写区分。
6.在一对多的双向关联中,一般将集合的inverse属性设为true,让集合的对方维护关联关系。例如:Group-User,由User来维护Group和User的关联关系。
7.在非分布式架构中,不需要使用DTO来向上层传输数据。直接使用POJO的Entity就可以了。


 

posted @ 2009-07-13 21:29  villion  阅读(1317)  评论(0编辑  收藏  举报