Hibernate提供了hibernate.properties文件来对hibernate进行一些配置,当然,几乎所有的配置都有对应的默认值。理解hibernate.properties不仅能更好的使用Hibernate,还能通过配置文件,了解一下hibernate内部的一些运行机制。下面就详细的来介绍hibernate中提供的配置项。注意,在etc/hibernate.properties文件中列出的hibernate配置项并不是完整的配置项,有一些可能需要在org.hibernate.cfg.AvailableSettings中查询。
在hibernate的manual文档中,3.4节有详细的hibernate配置项说明,下面我们会更完整的来看看这些配置项的功能,及在代码中的使用。
首先,无论使用hibernate4.2的ServiceRegistry启动或者直接使用hibernate.cfg.xml启动hibernate,都可以通过在classpath下放置一个hibernate.properties文件来配置hibernate。
一.Hibernate配置
1)
用于配置数据库方言。必须是org.hibernate.dialect.Dialect子类的类全限定名。该方言对象用于针对具体的数据库生成不同的SQL。一般情况下,其实这个dialect都可以不用手动指定,hibernate会根据数据库的metadata来自动选择相应的方言。
大家可以在StandardDialectResolver的resolveDialectInternal方法中看到:
protected Dialect resolveDialectInternal(DatabaseMetaData metaData) throws SQLException {
String databaseName = metaData.getDatabaseProductName();
if ( "MySQL".equals( databaseName ) ) {
return new MySQLDialect();
}
//..其他省略
}
如果没有设置方言,hibernate会自动的根据DatabaseMetaData选择合适的驱动。
2)
允许设置值为true或者false。将所有SQL语句输出到控制台,类似的,也可以通过设置log4j.properties文件,将log4j.logger.org.hibernate.SQL
比如,把hibernate.show_sql去掉,添加log4j.jar包(如果是hibernate3.5,需要再添加一个slf4j-log4j-xxx.jar包),在classpath下面添加一个log4j.xml文件,添加如下内容:
<log4j:configuration>
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="conversionPattern" value="%r [%t] %p %c %x - %m%n"/>
</layout>
</appender>
<logger name="org.hibernate.SQL">
<level value="DEBUG"></level>
<appender-ref ref="console"/>
</logger>
<root>
<level value="ERROR" />
</root>
</log4j:configuration>
再次运行,就可以看到同样输出SQL文件。
3)
允许设置值为true或者false,如果为true,打印在控制台中的SQL语句格式会更容易查看。这个选项对使用Log监控SQL同样有效。
4)
允许设置在hibenate中映射的表默认的schema/tablespace名称。在支持schema或表空间的数据库中有用。比如,在hibernate.properties文件中添加:
hibernate.default_schema
那么生成的SQL就会是这样:
insert
into
hibernate.USER
(name, age, borndate, married)
values
(?, ?, ?, ?)
//----------------------------------------------------------------
select
user0_.id as id1_0_,
user0_.name as name2_0_,
user0_.age as age3_0_,
user0_.borndate as borndate4_0_,
user0_.married as married5_0_
from
hibernate.USER user0_
where
user0_.married=?
当然,在映射文件中,也可以通过为class元素设置schema属性来覆盖默认的schema名称。比如:
<class name="User" table="USER" schema="scott">
<id name="id" access="field">
<generator class="native" />
</id>
<property name="name" column="name" />
<property name="age">
<column name="age" default="25" check="age > 10 and age < 100" />
</property>
<property name="bornDate" column="borndate"/>
<property name="married" column="married" type="yes_no"/>
</class>
那么生成的SQL会变成:
insert
into
scott.USER
(name, age, borndate, married)
values
(?, ?, ?, ?)
5)
允许设置在hibenate中映射的表默认的catalog名称(catalog可以简单理解为对数据库服务器在本地访问的一个别名,在MySQL里面没有这个概念,但是可以理解为我们在navicat中创建的一个链接名称就叫一个catalog,在DB2中有这个概念,在Oracle中可以把我们添加的本地命名当作一个catalog)。在支持schema或表空间的数据库中有用。比如,在hibernate.properties文件中添加:
hibernate.default_catalog
那么生成的SQL就会是这样:
insert
into
orcl.hibernate.USER //注意前面是catalog,后面才是schema
(name, age, borndate, married)
values
(?, ?, ?, ?)
当然,在映射文件中也可以单独设置catalog:
<class name="User" table="USER" catalog="orcl">