Hibernate实战读书摘要(1)—理解对象/关系持久化

1、构建SessionFactory

这是一个典型的Hibernate启动过程的例子,在一行代码中,使用自动的配置文件侦测:

SessionFactory sessionFactory = new Confiruration()
                       .configure()
                       .buildSessionFactory();


Hibernate怎么知道配置文件放置的位置,以及要加载哪个配置文件呢?

可以把Configuration当作Hibernate配置文件(或者属性文件)的一个对象表示法。

调用new Configuration()时,Hibernate在classpath的根目录下搜索名为hibernate.properties的文件。如果找到了,所有hibernate.*属性都会被加载并添加到Configuration对象。

调用configure()时,HIbernate在classpath的根目录下搜索名为hibernate.cfg.xml的文件,如果无法找到就会抛出一个异常。当然,如果你没有这个配置文件,就不一定要调用这个方法。如果XML配置文件中的设置与较早设置的属性完全相同,XML设置就覆盖前面的设置。

hibernate.properties配置文件的位置始终在classpath的根目录中,处在任何包之外。如果要使用一个不同的文件,或者要Hibernate在classpath的子目录中查找XML配置文件,就必须把路径当作configure()方法的一个实参进行传递:

SessionFactory sessionFactory = new Configuration()
                         .configure("/persistence/auction.cfg.xml")
                         .buildSessionFactory();

最后,在创建SessionFactory之前,你始终可以在Configuration对象中编程式的设置额外的配置选项或者映射文件位置:

SessionFactory sessionFactory = new Configuration()
                         .configure("/persistence/auction.cfg.xml")
                         .setProperty(Environment.DEFAULT_SCHEMA, "CAVEATEMPTPR")
                         .addResource("aucton/CreditCard.hbm.xml")
                         .buildSessionFactory();

许多配置源在这里得到应用:首先读取classpath中的Hibernate.properties文件(如果有的话)。接下来,添加来自/persistence/auction.cfg.xml的所有设置,并覆盖以前应用的任何设置。最后,通过编程设置另一个配置属性(默认的数据库Schema名称),并且添加另一个HIbernate XML映射元数据文件到配置中。

当然,可以通过编程设置所有选项,或者在不同的XML配置文件之间切换,得到不同的部署数据库。对于如何配置和部署Hibernate,实际上并没有限制;最后,只需要从一个准备好的配置中创建SessionFactory。

在大部分Hibernate应用程序中,SessionFactory应该在应用程序初始化期间被实例化一次。然后单独的实例应该为特定程序中的所有代码所用,任何Session都应该用这个单独的SessionFactory来创建。SessionFactory是线程安全的,且能够被共享;Session是个单线程的对象。

2、数据库连接

可以提供自己的连接吗?实现org.hibernate.connection.ConnnectionProvider接口,用hibernate.connection.provider_class配置选项命名你的实现。现在,如果Hibernate需要数据库连接,它将依赖于你定制的提供程序(provider)。

3、使用Hibernate EntityManager

Hibernate EntityManager是围绕提供JPA编程接口的Hibernate Core的一个包装,支持JPA实体实例的生命周期,并允许你用标准的Java Persistence查询语言编写查询。

JPA规范也定义编程接口、持久化对象的生命周期规则和查询特性。JPA这部分的Hibernate实现可被用作Hibernate EntityManager,这是另一个可以堆在Hibernate Core顶部的可选模块。当需要简单的Hibernate接口或者甚至需要JDBC连接时,可以退回。Hibernate原生的特性在各个方面都是JPA持久化的一个超集。(简单的事实就是,Hibernate EntityManager是对提供JPA兼容性的Hibernate Core的一个小包装。)

使用标准化的接口和标准化的查询语言有个好处:可以使用任何EJB 3.0兼容应用程序服务器执行JPA兼容的持久层。或者,可以在简单的Java中任何特定的标准运行时环境之外使用JPA(这是Hibernate Core可以被用在任何地方的真正含义)。

Hibernate Annotations应该与Hibernate EntityManager结合考虑。如果你针对JPA接口使用JPA编写应用程序代码,而没有用JPA注解创建大部分映射,这是不正常的。

Hibernate也是JBoss应用程序服务器(JBoss AS)的一部分,是J2EE 1.4和Java EE 5.0的一个实现。Hibernate Core、Hibernate Annotations和Hibernate EntityManager结合起来,形成了这个应用服务器的持久话引擎。因此,可以独立使用每件东西,也可以在应用服务器内部使用并享有所有EJB 3.0的益处,例如会话bean、消息驱动的bean和其他的Java EE服务。

如你所见,原生的Hibernate特性实现了规范的重要部分,或者是必要时提供额外功能的自然的供应商扩展。

有个简单的技巧,可以立即知道正在看的代码是JPA还是原生的Hibernate。如果只看见有javax.persistence.*导入,就是正处在规范内工作;如果也导入org.hibernate.*,就是正在使用原生的Hibernate功能。

SessionFactory在Hiibernate应用程序中表示一个特定的逻辑数据存储配置。EntityManager Factory在JPA应用程序中扮演这同样的角色,你用配置文件或者在应用程序代码中配置EntityManager Factory(EMF),就像配置SessionFactory一样。EMF的配置,与一组映射元数据(通常是被注解的类)一起,被称作持久化单元(persistence unit)

这些是Java Persistence中主要的编程接口:

javax.persistence.Persistence——给EntityManagerFactory的创建提供一种静态方法的一个启动类

javax.persistence.EntityManagerFactory——等同于Hibernate SessionFactory。这个运行时对象表示一个特定的持久化单元。它是线程安全的,通常被当作一个单例(singleton)处理,并给EntityManager实例的创建提供方法。

javax.persistence.EntityManager——等同于Hibernate Session。这个单线程、非共享的对象表示数据访问的一个特定工作单元。它提供方法去管理实体实例的生命周期并创建Query实例。

javax.persistence.Query——等同于Hibernate Query。一个对象是一种特定的JPA查询语言或者原生的SQL查询表示法,它允许参数的安全绑定,并给查询的执行提供个总各样的方法。

javax.persistence.EntityTransaction——等同于Hibernate Transaction,在Java SE环境中用于RESOURCE_LOCAL事务的划分。在Java EE中,依赖JTA标准的javax.transaction.UserTransaction接口进行编程式的事务划分。

4、如何使用带有Hibernate的几个数据库

如果要使用几个数据库,就创建几个配置文件,每个数据库都分配它自己的SessionFactory,并且从不同的Configuration对象中构建几个SessionFactory实例。每个Session都从任何SessionFactory中打开,在JNDI中查找托管数据源。现在协调这些资源就是事务和资源管理器的责任了——Hibernate只在这些数据库连接上执行SQL语句。事务范围用JTA进行编程式地设置,或者由包含EJB的容器和一个声明的集合来处理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章