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的方法。
- //实例化Configuration
- Configuration cfg = new Configuration()
- //多次调用addResource方法,添加映射文件
- .addResource("Item.hbm.xml")
- .addResource("Bid.hbm.xml");
查看hibernate.properties配置文件发现,该文件没有提供添加Hibernate映射文件的方式。因此使用hibernate.properties作为配置文件时,必须调用Configuration对象的addResource方法,使用该方法添加映射文件。
注意:正如上面代码中见到的,使用hibernate.properties文件配置Hibernate属性虽然简单,但因为需要在代码中手动添加映射文件——这是非常令人沮丧的事情。如果只有两个映射文件,当然问题不大,但如果有100个映射文件?或者更多?那将是非常无趣的工作。笔者宁愿在配置文件中添加映射文件,也不愿意在代码中手动添加。这就是实际开发中不使用hibernate.properties文件作为配置文件的原因。
当然,还有另一种添加映射文件的策略,因为映射文件和持久化类往往是一一对应的,可以通过向Configuration对象添加持久化类,让Hibernate自己搜索映射文件。代码片段如下:
- //实例化Configuration
- Configuration cfg = new Configuration()
- //多次调用addClass方法,直接添加持久化类
- .addClass(lee.Item.class)
- .addClass(lee.Bid.class);
注意:在这种方式下,所有的映射文件应该放在持久化类文件相同的包路径下;否则,Hibernate将不能正确搜索到对应的映射文件。采用这种方式的优点是:消除了系统对文件名的硬编码耦合。
2.使用hibernate.cfg.xml作为配置文件
前面已经看到,对于使用hibernate.cfg.xml配置文件的情形。因为hibernate.cfg.xml文件中已经添加了Hibernate映射文件,因此无须通过编程方式添加映射文件。采用这种配置文件创建Configuration实例可通过如下代码实现:
- //实例化Configuration
- Configuration cfg = new Configuration()
- //configure()方法将会负责加载hibernate.cfg.xml文件
- .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 配置属性也并非完全没有用处。这种策略可与前面两种策略结合,将部分关键配置属性放在代码中添加。- public class NewsManager
- {
- public static void main(String[] args) throws Exception
- {
- //实例化Configuration,不加载任何配置文件
- Configuration conf = new Configuration()
- //通过addClass方法添加持久化类
- .addClass(org.crazyit.app.domain.News.class)
- //通过setProperty设置Hibernate的连接属性。
- .setProperty("hibernate.connection.driver_class" ,
- "com.mysql.jdbc.Driver")
- .setProperty("hibernate.connection.url" ,
- "jdbc:mysql://localhost/hibernate")
- .setProperty("hibernate.connection.username" , "root")
- .setProperty("hibernate.connection.password" , "32147")
- .setProperty("hibernate.c3p0.max_size" , "20")
- .setProperty("hibernate.c3p0.min_size" , "1")
- .setProperty("hibernate.c3p0.timeout" , "5000")
- .setProperty("hibernate.c3p0.max_statements" , "100")
- .setProperty("hibernate.c3p0.idle_test_period" , "3000")
- .setProperty("hibernate.c3p0.acquire_increment" , "2")
- .setProperty("hibernate.c3p0.validate" , "true")
- .setProperty("hibernate.dialect" , "org.hibernate.dialect. MySQLInnoDBDialect")
- .setProperty("hibernate.hbm2ddl.auto" , "create");
- //以Configuration创建SessionFactory
- SessionFactory sf = conf.buildSessionFactory();
- //实例化Session
- Session sess = sf.openSession();
- //开始事务
- Transaction tx = sess.beginTransaction();
- //创建消息实例
- News n = new News();
- //设置消息标题和消息内容
- n.setTitle("疯狂Java联盟成立了");
- n.setContent("疯狂Java联盟成立了,"
- + "网站地址http://www.crazyit.org");
- //保存消息
- sess.save(n);
- //提交事务
- tx.commit();
- //关闭Session
- sess.close();
- }
- }
本文转自
fkJava李刚 51CTO博客,原文链接:http://blog.51cto.com/javaligang/898209 ,如需转载请自行联系原作者