org.hibernate.cfg.Configuration实例代表了应用程序到SQL数据库的映射配置, Configuration对象提供了一个buildSessionFactory方法,该方法可以产生一个不可变的SessionFactory对象。

也可以直接实例化Configuration来获取一个实例,并为它指定Hibernate映射定义文件。如果映射定义文件在类加载路径中,则可使用addResource()方法来添加映射定义文件。现在的问题是,如何创建Configuration对象?

随着Hibernate所使用配置文件的不同,创建Configuration对象的方式也不相同。通常有如下几种配置Hibernate的方式:

Ø  使用hibernate.properties文件作为配置文件。

Ø  使用hibernate.cfg.xml文件作为配置文件。

Ø  不使用任何配置文件,以编码方式创建Configuration对象。

Configuration实例的唯一作用是创建SessionFactory实例,所以它被设计成启动期间对象,一旦SessionFactory创建完成,它就被丢弃了。

1. 使用hibernate.properties作为配置文件

对于使用hibernate.properties作为配置文件的方式,比较适合于初学者。因为初学者往往很难记住Hibernate配置文件的详细格式,以及具体需要哪些属性。在Hibernate发布包的project\etc路径下,提供了一个hibernate.propertis文件,该文件详细列出了Hibernate配置文件的所有属性。每个配置段都给出了大致的注释,用户只需取消所需配置段的注释,就可以快速配置Hibernate与数据库的连接。关于常用的连接属性,将在下一节给出。此处给出使用hibernate.properties文件创建Configuration的方法。


  1. //实例化Configuration  
  2. Configuration cfg = new Configuration()  


  1.  
  2.     //多次调用addResource方法,添加映射文件  
  3.     .addResource("Item.hbm.xml")  
  4.     .addResource("Bid.hbm.xml");  

 

查看hibernate.properties配置文件发现,该文件没有提供添加Hibernate映射文件的方式。因此使用hibernate.properties作为配置文件时,必须调用Configuration对象的addResource方法,使用该方法添加映射文件。

注意:正如上面代码中见到的,使用hibernate.properties文件配置Hibernate属性虽然简单,但因为需要在代码中手动添加映射文件——这是非常令人沮丧的事情。如果只有两个映射文件,当然问题不大,但如果有100个映射文件?或者更多?那将是非常无趣的工作。笔者宁愿在配置文件中添加映射文件,也不愿意在代码中手动添加。这就是实际开发中不使用hibernate.properties文件作为配置文件的原因。

当然,还有另一种添加映射文件的策略,因为映射文件和持久化类往往是一一对应的,可以通过向Configuration对象添加持久化类,让Hibernate自己搜索映射文件。代码片段如下:


  1. //实例化Configuration  
  2. Configuration cfg = new Configuration()  
  3.     //多次调用addClass方法,直接添加持久化类  
  4.     .addClass(lee.Item.class)  
  5.     .addClass(lee.Bid.class);  

注意:在这种方式下,所有的映射文件应该放在持久化类文件相同的包路径下;否则,Hibernate将不能正确搜索到对应的映射文件。采用这种方式的优点是:消除了系统对文件名的硬编码耦合。

2.使用hibernate.cfg.xml作为配置文件

前面已经看到,对于使用hibernate.cfg.xml配置文件的情形。因为hibernate.cfg.xml文件中已经添加了Hibernate映射文件,因此无须通过编程方式添加映射文件。采用这种配置文件创建Configuration实例可通过如下代码实现:


  1. //实例化Configuration  
  2. Configuration cfg = new Configuration()  
  3.     //configure()方法将会负责加载hibernate.cfg.xml文件  


  1.  
  2.     .configure();  

 

3.不使用配置文件创建Configuration实例

这是一种极端的情况,通常不会通过这种方式创建Configuration实例。Configuration对象提供了如下三个方法。

Ø  Configuration addResource(String resourceName):用于为Configuration对象添加一个映射文件。

Ø  Configuration setProperties(Properties properties):用于为Configuration对象设置一系列属性,这系列属性通过Properties实例传入。

Ø  Configuration setProperty(String propertyName, String value):用于为Configuration对象设置一个单独的属性。

正是通过如上三个方法,可以无须任何配置文件支持,直接通过编程方式创建Configuration实例。具体的代码片段如下。

程序清单:codes\05\5.4\noConfig\src\lee\NewsManager.java

从上面的代码片段中可以看出,使用这种代码方式来创建Configuration实例是一件极度烦琐的事情。因为需要将Hibernate所有的配置属性都通过代码设置,并需要在代码中手动加载所有映射文件。对于一个大项目,创建一个Configuration实例可能需要一大段代码。这种方式既不利于编程实现,也不利于后期代码维护,因此实际开发中不推荐使用这种策略。

提示:实际上,在代码中设置

Hibernate配置属性也并非完全没有用处。这种策略可与前面两种策略结合,将部分关键配置属性放在代码中添加。


  1. public class NewsManager  
  2. {  
  3.     public static void main(String[] args) throws Exception  
  4.     {  
  5.         //实例化Configuration,不加载任何配置文件  
  6.         Configuration conf = new Configuration()  
  7.             //通过addClass方法添加持久化类  
  8.             .addClass(org.crazyit.app.domain.News.class)  
  9.             //通过setProperty设置Hibernate的连接属性。  
  10.             .setProperty("hibernate.connection.driver_class" ,   
  11.             "com.mysql.jdbc.Driver")  
  12.             .setProperty("hibernate.connection.url" ,   
  13.             "jdbc:mysql://localhost/hibernate")  
  14.             .setProperty("hibernate.connection.username" , "root")  
  15.             .setProperty("hibernate.connection.password" , "32147")  
  16.             .setProperty("hibernate.c3p0.max_size" , "20")  
  17.             .setProperty("hibernate.c3p0.min_size" , "1")  
  18.             .setProperty("hibernate.c3p0.timeout" , "5000")  
  19.             .setProperty("hibernate.c3p0.max_statements" , "100")  
  20.             .setProperty("hibernate.c3p0.idle_test_period" , "3000")  
  21.             .setProperty("hibernate.c3p0.acquire_increment" , "2")  
  22.             .setProperty("hibernate.c3p0.validate" , "true")  
  23.             .setProperty("hibernate.dialect" , "org.hibernate.dialect.                  MySQLInnoDBDialect")  
  24.             .setProperty("hibernate.hbm2ddl.auto" , "create");  
  25.         //以Configuration创建SessionFactory  
  26.         SessionFactory sf = conf.buildSessionFactory();  
  27.         //实例化Session  
  28.         Session sess = sf.openSession();  
  29.         //开始事务  
  30.         Transaction tx = sess.beginTransaction();  
  31.         //创建消息实例  
  32.         News n = new News();  
  33.         //设置消息标题和消息内容  
  34.         n.setTitle("疯狂Java联盟成立了");  
  35.         n.setContent("疯狂Java联盟成立了," 
  36.             + "网站地址http://www.crazyit.org");  
  37.         //保存消息  
  38.         sess.save(n);  
  39.         //提交事务  
  40.         tx.commit();  
  41.         //关闭Session  
  42.         sess.close();  
  43.     }  
  44. }