hibernate的Configuration和配置文件
一、hibernate的入口Configuration
在Hibernate中,Configuration是hibernate的入口。在实例化一个Configuration的时候,Hibernate会自动在环境变量(classpath)里面查找Hibernate配置文件hibernate.properties。如果该文件存在,则将该文件的内容加载到一个Properties的实例GLOBAL_PROPERTIES里面,如果不存在,将打印信息hibernate.properties not found;
接下来Hibernate将所有系统环境变量(System.getProperties())也添加到GLOBAL_PROPERTIES里面。如果配置文件hibernate.properties存在,系统还会进一步验证这个文件配置的有效性,对于一些已经不支持的配置参数,系统将打印出警告信息。
默认状态下configure()方法会自动在环境变量(classpath)下面寻找Hibernate配置文件hibernate.cfg.xml,如果该文件不存在,系统会打印如下信息并抛出HibernateException异常: hibernate.cfg.xml not found;如果该文件存在,configure()方法会首先访问<session-factory>,并获取该元素name的属性,如果name的属性非空,将用这个配置的值来覆盖hibernate.properties的hibernate.session_factory_name的配置的值,从这里我们可以看出,hibernate.cfg.xml里面的配置信息可以覆盖hibernate.properties的配置信息。
二、Configuration常用操作函数
(1)使用Hibernate配置文件
1、 Configuration 指定映射文件
Configuration cfg=new Configuration().configure("/hibernate.cfg.xml");
或者Configuration cfg=new Configuration().configure("/hibernate.properties");
2、Configuration指定映射文件
cfg.addResource("test/User.hbm.xml");
3、Configuration指定POJO类,User.hbm.xml根User.java一个目录
cfg.addClass(test.Order.class);
(2) Configuration指定Hibernate配置属性(无配置文件,加载了配置文件就不能使用这个方法)
Configuration cfg = new Configuration()
.addClass(test.User.class)
.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
.setProperty("hibernate.connection.datasource", "java:comp/env/jdbc/test")
.setProperty("hibernate.order_updates", "true");
(3) SessionFactory
1、单个 SessionFactory实例
SessionFactory sessions = cfg.buildSessionFactory();
当所有映射定义被 Configuration 解析后,应用程序必须获得一个用于构造org.hibernate.Session 实例的工厂SessionFactory。这个工厂将被应用程序的所有线程共享,线程安全的全局对象,只需要被实例化一次。单例模式。
2、Hibernate 允许应用程序创建多个SessionFactory 实例
用xml配置来配置多个数据库的话,那就写多个配置文件。
对应两个数据库(一个是MySQL,一个是SQLServer),可以把其xml文件定义为“mysql.cfg.xml” 和 “sqlserver.cfg.xml”。
Configuration类获取SessionFactory的代码如下:
SessionFactory mysqlFactory = new Configuration().configure("/mysql.cfg.xml").buildSessionFactory();
SessionFactory sqlserverFactory = new Configuration().configure("/sqlserver.cfg.xml ").buildSessionFactory();
三、Hibernate配置参数详解
1、Hibernate JDBC 属性
属性名 |
用途 |
hibernate.connection.driver_class |
JDBC driver class |
hibernate.connection.url |
JDBC URL |
hibernate.connection.username |
database user |
hibernate.connection.password |
数据库用户密码 |
hibernate.connection.pool_size |
maximum number of pooled connections |
2、Hibernate 数据源属性
属性名 |
用途 |
hibernate.connection.datasource |
数据源 JNDI 名字 |
hibernate.jndi.url JNDI |
提供者的 URL(可选) |
hibernate.jndi.class JNDI |
InitialContextFactory 类(可选) |
hibernate.connection.username |
数据库用户(可选) |
hibernate.connection.password |
数据库密码(可选) |
3、可选的配置属性
有大量属性能用来控制 Hibernate 在运行期的行为。它们都是可选的,并拥有适当的默认值。
属性名 |
用途 |
可选值 ()内为默认 |
hibernate.dialect |
允许 Hibernate 针对特定的关系数据库生成优化的SQL 的 org.hibernate.dialect.Dialect 的类名。 例如:org.hibernate.dialect.MySQLDialect |
|
hibernate.show_sql |
输出所有 SQL 语句到控制台。 |
true|false (false) |
hibernate.format_sql |
在 log 和 console 中打印出更漂亮的 SQL。 |
true|false (false) |
hibernate.default_catalog |
在生成的 SQL 中,将给定的 catalog 附加于非全限定名的表名上 |
|
hibernate.session_factory_name |
org.hibernate.SessionFactory 创建后,将自动使用这个名字绑定到 JNDI 中。 |
|
hibernate.max_fetch_depth |
为单向关联(一对一,多对一)的外连接抓取(outer join fetch)树设置最大深度。 |
0到3 |
hibernate.default_batch_fetch_size |
为 Hibernate 关联的批量抓取设置默认数量。 |
4、8、16 |
hibernate.default_entity_mode |
为由这个 SessionFactory 打开的所有 Session指定默认的实体表现模式。 |
dynamic-map,dom4j,pojo |
hibernate.order_updates |
强制 Hibernate 按照被更新数据的主键,为SQL 更新排序。这么做将减少在高并发系统中事务的死锁。 |
true|false
|
hibernate.generate_statistics |
如果开启,Hibernate 将收集有助于性能调节的统计数据。 |
true|false
|
hibernate.use_identifier_rollback |
如果开启,在对象被删除时生成的标识属性将被重设为默认值。 |
true|false
|
hibernate.use_sql_comments |
如果开启,Hibernate 将在 SQL 中生成有助于调试的注释信息,默认值为 false。 |
true|false (false) |