管理环境提供了许多直接的管理功能,诸如安全、连接池、事务管理等等。J2EE服务器就是典型的管理环境。虽然J2EE服务器被经常用来支持EJB,但是你也可以使用除了EJB之外许多其他的服务。
Hibernate经常被用来和Session、消息驱动Bean一起工作,EJB调用Hibernate和调用Servlet,jsp没什么区别。Hibernate可以在管理环境和非管理环境之间方便的移植,Hibernate对我们屏蔽了那些不同的连接和管理策略。
图2.4 在管理环境中的Hibernate
应用服务器将数据库连接暴露为一个JNDI资源,所以你需要告诉Hibernate到哪里去寻找DataSource,列表2.5给出了这样的例子。
第一行给出了datasource的JNDI名字,这个Datasource必须在服务器的部署描述符中被记录。下一行,你告诉Hibernate使用JTA。接下来是Hibernate需要知道到哪里去查找TransactionManager,虽然J2EE没有提供标准的规范,但是Hibernate提供了对于大多数服务器的支持。最后,就是配置你的数据库方言。
到现在为止我们已经配置完了Hibernate,看起来管理环境和非管理环境的配置没什么不同,但是,如果你需要对于事务进行更详细的配置,那么就需要一些额外的操作。
Java有标准的管理事务的API,JTA。这被称之为容器管理的事务CMT。当使用JTA的时候,JDBC的连接就会完全受它的控制,这点和非管理环境有很大的不同,在非管理环境中,你需要自己去管理事务。
因此在管理和非管理环境中,事务管理使用了不同的方法,由于Hibernate可以在这些环境中方便的移植,所以Hibernate定义的关于事务的API抽象了JTA和JDBC事务策略的不同,关于事务策略的配置需要通过hibernate.connection.factory_class,这个属性可以被配成下面的两个值:
- net.sf.hibernate.transaction.JDBCTransactionFactory。直接使用JDBC事务,这种情况通常在非管理环境中出现,默认情况下不使用任何策略。
- net.sf.hibernate.transaction.JTATransactionFactory。则指向JTA,负责容器管理的事务。
如果想更详细的了解Hibernate的API,那么请翻到第五章5.1节,当你使用J2EE服务器的时候,你需要记住亮点:将Hibernate的工厂类设为JTA,指定Transaction Manager。
现在你已经拥有了一个运行的Hibernate的系统了,无论你使用的是管理环境还是非管理环境。创建编译你的持久化类,把Hibernate的类库放到你的classpath上,并且配置好你的Hibernate.properties,创建你的SessionFactory。
下一个部分包含了Hibernate的高级配置,许多配置都是推荐使用的,诸如SQL的日志管理、用XML配置文件来替代Properties文件。当然你也可以略过这一部分,在你需要的时候再回来看也不迟。