hibernate培训笔记.doc
2022年-2023年建筑工程管理行业文档 齐鲁斌创作Hibernate培训教程 作者:刘会军(jfmind) 2006年11月17日hibernate简史3标准方面3ORM(object relational mapping)3成功之道3何为hibernate4持久层设计4持久层概念4ORM(object relational mapper)对象-关系型数据映射组件4设计模式5资源管理模式5解藕合设计6体系结构6概况6实例状态8O/R映射9basic o/r mapping9集合类映射10关联关系映射10组件映射10继承映射10核心接口10分类10详解11数据检索13Hibernate Query Language (HQL)13Criteria queries (QBC)13Native SQL queries13开发13基本配置14高级配置15hibernate最佳实践15参考15hibernate简史hibernate是在JDBC之上提供一层薄薄的封装,在提供完全透明的持久化机制的同时又提供尽可能多的灵活性。相比之ibatis则是面向“语句映射”的层面,使用SQL作为查询语言。标准方面J2EE提供了两个持久化的手段:JDBC,它是J2SE中访问关系数据库系统的标准API,然而却以一种错误的编程模型来强制开发者用java代码来处理关系思想;另一个是实体Beans ,它是EJB中专门模型化持久化实体的组件,一是不能处理持久对象间的关系,二是使用了糟糕的查询语言,三是难于测试。ORM(object relational mapping)由于J2EE持久化标准对于处理对象与关系的尴尬,而且持久化问题的解决方案是由关系-对象映射(ORM)来解决的,它可以透明地持久化普通java对象(POJO)。因此,ORM框架悠然而生。1990年,一些商业的ORM工具就出现了,比如TopLink。但由于其价格昂贵、结构复杂并且与Sun的实体bean标准相左,所以很少人会用。2001年,JDO(java data object)在Java Community Progress(www.jcp.org)的规范中出现。因其试图建立一个完整的持久层框架,追求标准化陷入僵局;标准很不完善,存在重大缺陷,产品分裂, 也没有一个好的开源免费实现,也没有能够流行。2001年末,hibernate第一个正式版本对外发布,赢得了开源社区的一片赞誉。2003年6月8日,hibernate 2的发布,奠定了成功的基石。开始进入国内开发人员视野。2003年末,hibernate获得了Jolt 2004大奖以及被jboss收购,确立了hibernate在java orm架构中的主导地位,ORM工业标准。2005年3月,hibernate 3正式发布。 成功之道l 快速发布,即时响应l 全面的回归测式l 追求卓越l 避免过度设计l 集权l 文档l 避免标准化l 10分钟之内把Hibernate跑起来l 开发人员的责任感l 易用的、可更新的wiki网页何为hibernate创建一份XML“映射文档”,告诉Hibernate您希望能够保存在数据库中的类,以及它们如何关联到该数据库中的表和列,然后就可以要求它以对象的形式获取数据,或者把对象保存为数据。运行时,Hibernate读取映射文档,然后动态构建Java类,以便管理数据库与Java之间的转换。在Hibernate中有一个简单而直观的API,用于对数据库所表示的对象执行查询。要修改这些对象,(一般情况下)只需在程序中与它们进行交互,然后告诉Hibernate保存修改即可。类似地,创建新对象也很简单;只需以常规方式创建它们,然后告诉Hibernate有关它们的信息,这样就能在数据库中保存它们。持久层设计持久层概念专注于实现持久化的一个相对独立的领域,可以通过一个简单的逻辑图表达。ORM(object relational mapper)对象-关系型数据映射组件优点:l 减少乏味的代码l 更加面向对象的设计l 更好的性能l 更好的移植性缺点:l 粒度问题granularityl 子类型问题subtypesl 同一性问题identityl 关联问题associationsl 对象导航问题navigation设计模式l 工厂模式factoryl 代理模式proxyl decorator模式l dynamic proxy模式资源管理模式A. DAO(data access object)模式I.DAO模式的实现层次:l data accessor模式实现数据访问与业务逻辑分离,将数据访问的实现机制加以封装,与数据的使用代码加以分离,从外部来看,data accessor提供了黑盒式的数据存取接口。l active domain object模式实现业务数据的对象化封装II.优点l 数据存储逻辑分离l 数据访问底层分离l 资源管理和调度分离l 数据抽象B. 数据库连接池connection pool基本原理:在内部对象池中维护一定数量的数据库连接,对外暴露数据库连接获取和返回方法。优点:l 资源重用l 更快的响应速度l 新的资源分配手段l 统一的连接管理,避免数据库连接泄漏解藕合设计l 应用层:应用逻辑与数据逻辑分离l 资源层:逻辑结构与物理结构分离体系结构概况A.一个非常重要的hibernate体系结构概要图:可以看出,hibernate是使用数据库和配置信息为应用程序提供服务(以及持久化对象)。B. 轻型体系结构图C. 体系结构方案 实例状态一个持久化类的实例可能处于三种不同状态中的某一种,这三种状态的定义则与所谓的持久化上下文(persistence context)有关。hibernate的session对象就是这个所谓的持久化上下文:l 瞬态(transient)该实例从未与任何持久化上下文关联过,它没有持久化标识(相当于主键值)。l 持久化(persistent)实例目前与某个持久化上下文有关联,它拥有持久化标识,并且可能在数据库中有一个对应的行,对于某一个特定的持久化上下文,hibernate保证持久化标识与java标识等价。l 脱管(detached)实例曾经与某个持久化上下文发生过关联,不过那个上下文被关闭了,或者这个实例是被序列化到另外的进程。它拥有持久化标识,并且在数据库中可能存在一个对应的行。对于脱管状态的实例,hibernate不保证任何持久化标识和java标识的关系。持久化对象的生命周期(lifecycle):O/R映射basic o/r mappingi.映射定义(mapping declaration)以java为中心的映射语言,易读,可手工修改的xml文档。是按持久化的类定义创建而非数据库中的表。ii.hibernate类型iii.集合类映射关联关系映射组件映射继承映射核心接口分类显示的接口可以近似地分为如下几类: 由应用调用以完成基本的CRUD和查询操作的接口。这些接口是应用的业务/控制逻辑对Hibernate的主要的依赖点。它们包括Session,Transaction和Query。(Interfaces called by applications to perform basic CRUD and querying operations. These interfaces are the main point of dependency of application business/control logic on Hibernate. They include Session, Transaction, and Query.) 由应用的底层代码调用以配置Hibernate的接口,最重要的是Configuration类。( Interfaces called by application infrastructure code to configure Hibernate, most importantly the Configuration class.) 允许应用对Hibernate内部出现的事件进行处理的回调接口,例如Interceptor,Lifecycle和Validatable接口。(Callback interfaces that allow the application to react to events occurring inside Hibernate, such as Interceptor, Lifecycle, and Validatable.) 允许对Hibernate强大的映射功能进行扩展的接口, 例如UserType ,CompositeUserType和IdentifierGenerator。这些接口由应用的底层代码实现(如果需要的话)。( Interfaces that allow extension of Hibernates powerful mapping functionality, such as UserType, CompositeUserType, and IdentifierGenerator. These interfaces are implemented by application infrastructure code (if necessary). )详解Configuration正如其名,Configuration 类负责管理Hibernate 的配置信息。Hibernate 运行时需要获取一些底层实现的基本信息,其中几个关键属性包括:1、数据库URL2、数据库用户3、数据库用户密码4、数据库JDBC驱动类1、 数据库dialect,用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现,如Hibernate数据类型到特定数据库数据类型的映射等。当然,还有指定Hibernate映射文件的位置。(*.hbm.xml)。Hibernate配置有两种方法:一、 属性文件配置。默认文件名是hibernate.properties。调用代码: Configuration config = new Configuration();二、 XML文件配置。默认文件名是hibernate.cfg.xml。Configuration config = new Configuration().configure();SessionFactory:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它打算在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话工厂例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。它也保存了在一个工作单元中读入的数据并且可能在以后的工作单元中被重用(只有类和集合映射指定了使用这种二级缓存时才会如此)。SessionFactory sessionFactory = config.buildSessionFactory();Session(会话):该接口是Hibernate使用最多的接口。Session不是线程安全的,它代表与数据库之间的一次操作。Session通过SessionFactory打开,在所有的工作完成后,需要关闭:它的概念介于Connection和Transaction之间。我们可以简单的认为它是已经装载对象的缓存或集合的一个独立工作单元。我们有时也称Session为持久化管理器,因为它是与持久化有关的操作的接口。Hibernate会话并不是线程安全的因此应该被设计为每次只能在一个线程中使用。Hibernate会话与Web层的HttpSession没有任何关系。Session session = sessionFactory.openSession();Transaction:事务将应用代码从底层的事务实现中抽象出来这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)允许应用通过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。Transaction trans = session.beginTransaction ();Query: Query(查询)接口允许你在数据库上执行查询并控制查询如何执行。查询语句使用HQL或者本地数据库的SQL方言编写。Query query = session.createQuery(“from User”);Lifecycle:Lifecycle接口提供了一些回调方法,可以让持久化对象在save或load之后,或者在delete或update之前进行必要的初始化与清除步骤。public interface Lifecycle public boolean onSave(Session s) throws CallbackException; (1) public boolean onUpdate(Session s) throws CallbackException; (2) public boolean onDelete(Session s) throws CallbackException; (3) public void onLoad(Session s, Serializable id); (4)(1) onSave - 在对象即将被save或者insert的时候回调 (2) onUpdate - 在对象即将被update的时候回调(也就是对象被传递给Session.update()的时候) (3) onDelete - 在对象即将被delete(删除)的时候回调 (4) onLoad - 在对象刚刚被load(装载)后的时候回调Validatable: 该接口是合法性检查的回调。如果持久化类需要在保存其持久化状态前进行合法性检查,它可以实现下面的接口: public interface Validatable public void validate() throws ValidationFailure;如果发现对象违反了某条规则,应该抛出一个ValidationFailure异常。在Validatable实例的validate()方法内部不应该改变它的状态。 和Lifecycle接口的回调方法不同,validate()可能在任何时间被调用。应用程序不应该把validate()调用和商业功能联系起来。Interceptor: Interceptor接口提供从session到你的应用程序的回调方法,让你的程序可以观察和在持久化对象保存/更改/删除或者装载的时候操作它的属性。一种可能的用途是用来监视统计信息。比如,下面的Interceptor会自动在一个Auditable创建的时候设置其createTimestamp,并且当它被更改的时候,设置其lastUpdateTimestamp属性。UserType: 开发者创建属于他们自己的值类型也是很容易的。比如说,你可能希望持久化java.lang.BigInteger类型的属性,持久化成为VARCHAR字段。Hibernate没有内置这样一种类型。自定义类型能够映射一个属性(或集合元素)到不止一个数据库表字段。比如说,你可能有这样的Java属性:getName()/setName(),这是java.lang.String类型的,对应的持久化到三个字段:FIRST_NAME, INITIAL, SURNAME。 要实现一个自定义类型,可以实现net.sf.hibernate.UserType或net.sf.hibernate.CompositeUserType中的任一个,并且使用类型的Java全限定类名来声明属性。请查看net.sf.hibernate.test.DoubleStringType这个例子,看看它是怎么做的。 <property name="twoStrings" type="net.sf.hibernate.test.DoubleStringType"> <column name="first_string"/> <column name="second_string"/></property>注意使用<column>标签来把一个属性映射到多个字段的做法。数据检索Hibernate Query Language (HQL)object-oriented dialect of ANSI SQLCriteria queries (QBC)extensible framework for query objectsincludes Query By Example (QBC)detachedCriteriaNative SQL queriesdirect passthrough with automatic mappingnamed SQL queries in metadata开发基于B/S的典型三层架构:基本配置Managed environmentPools resources such as database connections and allows transaction boundaries and security to be specified declaratively (that is, in metadata). A J2EE application server such as JBoss, BEA WebLogic, or IBM WebSphere implements the standard (J2EE-specific) managed environment for Java.Jdbc connection pooling in a non-managed environmentHibernate with a connection pool in a non-managed environmentNon-managed environmentProvides basic concurrency management via thread pooling. A servlet container like Jetty or Tomcat provides a non-managed server environment for Java web applications. A stand-alone desktop or command-line application is also considered non-managed. Non-managed environments dont provide automatic transaction or resource management or security infrastructure. The application itself manages database connections and demarcates transaction boundaries. Hibernate in a managed environment with an application server高级配置hibernate最佳实践参考hibernate in actionhibernate reference深入浅出hibernate