因为Hibernate被设计为可以在许多不同环境下工作,所以它有很多配置参数。幸运的是,大部分都已经有默认值了,Hibernate发行包中还附带有示例的hibernate.properties文件,它演示了一些可变的参数。
net.sf.hibernate.cfg.Configuration的一个实例代表了应用程序中所有的Java类到关系数据库的映射的集合。这些映射是从一些XML映射文件中编译得来的。你可以得到一个Configuration的实例,直接实例化它即可。下面有一个例子,用来从两个XML配置文件中的映射中初始化:
Configuration cfg = new Configuration() .addFile("Vertex.hbm.xml") .addFile("Edge.hbm.xml");
另外一个(或许是更好的)方法是让Hibernate自行用getResourceAsStream()来装载映射文件。
Configuration cfg = new Configuration() .addClass(eg.Vertex.class) .addClass(eg.Edge.class);
Hibernate 就会在classpath中寻找叫做/eg/Vertex.hbm.xml、/eg/Edge.hbm.xml的映射文件。这种方法取消了所有对文件名的硬编码。
Configuration也可以指定一些可选的配置项。
Properties props = new Properties(); ... Configuration cfg = new Configuration() .addClass(eg.Vertex.class) .addClass(eg.Edge.class) .setProperties(props);
Configuration是仅在配置期使用的对象,从第一个SessionFactory开始建立的时候,它就失效了。
当所有的映射都被Configuration解析之后,应用程序为了得到Session实例,必须先得到它的工厂。这个工厂应该是被应用程序的所有线程共享的。当然,Hibernate并不禁止你的程序实例化多个SessionFactory。在你使用不止一个数据库的时候,这就有用了。
SessionFactory sessions = cfg.buildSessionFactory();
SessionFactory可以使用一个用户自行提供的JDBC连接来打开一个Session。这种设计可以让应用程序来自己管理JDBC连接。应用程序必须小心,不能在同一个连接上打开多个并行的session。
java.sql.Connection conn = datasource.getConnection(); Session sess = sessions.openSession(conn); // start a new transaction (optional) Transaction tx = sess.beginTransaction();
上面的最后一行是可选的——应用程序也可能选择自行管理JTA或者JDBC事务。当然,假若你使用Hibernate Transaction,你的客户代码就可以从底层的实现中抽象出来了。(比如说,你可以将来在需要的时候切换到CORBA连接,而不需要更改程序代码。)