ITEEDU

3.5. 其它配置属性

下面是一些在运行时可以改变Hibernate行为的其他配置。所有这些都是可选的,也有合理的默认值。

系统级别的配置只能通过java -Dproperty=value或者在hibernate.properties文件中配置,而不能通过传递给Configuration的Properties实例来配置。

Table 3.3. Hibernate配置属性

属性名 用途
hibernate.dialect Hibernate方言(Dialect)的类名 - 可以让Hibernate使用某些特定的数据库平台的特性

取值. full.classname.of.Dialect

hibernate.default_schema 在生成的SQL中,scheml/tablespace的全限定名

取值. SCHEMA_NAME

hibernate.session_factory_name 把SessionFactory绑定到JNDI中去.

取值. jndi/composite/name

hibernate.use_outer_join 允许使用外连接抓取.

取值. true | false

hibernate.max_fetch_depth 设置外连接抓取树的最大深度

取值. 建议设置为0到3之间

hibernate.jdbc.fetch_size 一个非零值,用来决定JDBC的获取量大小。(会调用calls Statement.setFetchSize()).
hibernate.jdbc.batch_size 一个非零值,会开启Hibernate使用JDBC2的批量更新功能

取值. 建议值在 5 和 30之间。

hibernate.jdbc.use_scrollable_resultset 允许Hibernate使用JDBC2提供的可滚动结果集。只有在使用用户自行提供的连接时,这个参数才是必需的。否则Hibernate会使用连接的元数据(metadata)。

取值. true | false

hibernate.jdbc.use_streams_for_binary 在从JDBC读写binary(二进制)或者serializable(可序列化)类型时,是否使用stream(流). 这是一个系统级别的属性。

取值. true | false

hibernate.cglib.use_reflection_optimizer 是否使用CGLIB来代替运行时反射操作。(系统级别属性,默认为在可能时都使用CGLIB).在调试的时候有时候使用反射会有用。

取值. true | false

hibernate.jndi.<propertyName> 把propertyName这个属性传递到JNDI InitialContextFactory去 (可选)
hibernate.connection.isolation 事务隔离级别 (可选)

取值. 1, 2, 4, 8

hibernate.connection.<propertyName> 把 propertyName这个JDBC 属性传递到DriverManager.getConnection()去.
hibernate.connection.provider_class 指定一个自定义的ConnectionProvider类名

取值. classname.of.ConnectionProvider

hibernate.cache.provider_class 指定一个自定义的CacheProvider缓存提供者的类名

取值. classname.of.CacheProvider

hibernate.cache.use_minimal_puts 优化第二层缓存操作,减少写操作,代价是读操作更频繁(对于集群缓存很有用)

取值. true|false

hibernate.cache.use_query_cache 打开查询缓存

取值. true|false

hibernate.cache.region_prefix 用于第二层缓存区域名字的前缀

取值. prefix

hibernate.transaction.factory_class 指定一个自定义的TransactionFactory类名,Hibernate Transaction API将会使用

取值. classname.of.TransactionFactory

jta.UserTransaction JTATransactionFactory 用来获取JTA UserTransaction的JNDI名

取值. jndi/composite/name

hibernate.transaction.manager_lookup_class TransactionManagerLookup的类名 - 当在JTA环境中,JVM级别的缓存被打开的时候使用

取值. classname.of.TransactionManagerLookup

hibernate.query.substitutions 把Hibernate查询中的一些短语替换为SQL短语(比如说短语可能是函数或者字符) .

取值. hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC

hibernate.show_sql 把所有的SQL语句都输出到控制台(可以作为log功能的一个替代)

取值. true | false

hibernate.hbm2ddl.auto 自动输出schema创建DDL语句.

取值. update | create | create-drop

3.5.1. SQL Dialects SQL 方言

你总是可以为你的数据库设置一个hibernate.dialect方言,它是net.sf.hibernate.dialect.Dialect 的一个子类。如果你不需要使用基于native或者sequence的主键自动生成算法,或者悲观锁定(使用Session.lock() 或 Query.setLockMode())的话,方言就可以不必指定。然而,假若你指定了一个方言,Hibernate会为上面列出的一些属性使用特殊默认值,省得你手工指定它们。

Table 3.4. Hibernate SQL 方言 (hibernate.dialect)

RDBMS 方言
DB2 net.sf.hibernate.dialect.DB2Dialect
MySQL net.sf.hibernate.dialect.MySQLDialect
SAP DB net.sf.hibernate.dialect.SAPDBDialect
Oracle (所有版本) net.sf.hibernate.dialect.OracleDialect
Oracle 9 net.sf.hibernate.dialect.Oracle9Dialect
Sybase net.sf.hibernate.dialect.SybaseDialect
Sybase Anywhere net.sf.hibernate.dialect.SybaseAnywhereDialect
Progress net.sf.hibernate.dialect.ProgressDialect
Mckoi SQL net.sf.hibernate.dialect.MckoiDialect
Interbase net.sf.hibernate.dialect.InterbaseDialect
Pointbase net.sf.hibernate.dialect.PointbaseDialect
PostgreSQL net.sf.hibernate.dialect.PostgreSQLDialect
HypersonicSQL net.sf.hibernate.dialect.HSQLDialect
Microsoft SQL Server net.sf.hibernate.dialect.SybaseDialect
Ingres net.sf.hibernate.dialect.IngresDialect
Informix net.sf.hibernate.dialect.InformixDialect
FrontBase net.sf.hibernate.dialect.FrontbaseDialect

3.5.2. 外连接抓取(Outer Join Fetching )

如果你的数据库支持ANSI或者Oracle风格的外连接,外连接抓取可能提高性能,因为可以限制和数据库交互的数量(代价是数据库自身进行了更多的工作)。外连接抓取允许你在一个select语句中就可以得到一个由多对一或者一对一连接构成的对象图。

默认情况下,抓取在叶对象,拥有代理的对象或者产生对自身的引用时终止。对一个特定关联来说,通过在XML映射文件中设置outer-join属性可以控制是否开启抓取功能。也可以设置hibernate.use_outer_join为false来全局关闭此功能。 你也可以通过hibernate.max_fetch_depth来设置抓取得对象图的最大深度。

3.5.3. 二进制流

Oracle限制通过它的JDBC驱动传递的byte数组的大小。如果你希望使用很大数量的binary或者serializable 类型的话,你需要打开hibernate.jdbc.use_streams_for_binary。这只能通过JVM级别设定

3.5.4. 在控制台记录SQL

hibernate.show_sql强制Hibernate把每一句SQL语句都写到控制台。这是作为打开log的一个简易替代。

3.5.5. 自定义 ConnectionProvider

你可以自定义你的获取JDBC连接的策略,只需要实现net.sf.hibernate.connection.ConnectionProvider接口。在hibernate.connection.provider_class设置你自己的实现的类名。

3.5.6. 常用数据库属性

几个配置属性影响除了DatasourceConnectionProvider之外的所有内置连接提供者.它们是: hibernate.connection.driver_class, hibernate.connection.url, hibernate.connection.username and hibernate.connection.password.

hibernate.connection.isolation应该指定为一个整数值。(查阅java.sql.Connection可以得到值的含义,但注意大多数数据库不会支持所有的隔离级别。)

专用的连接属性可以通过在"hibernate.connnection"后面加上属性名来指定。比如,你可以通过hibernate.connnection.charSet指定一个charSet。

3.5.7. 自定义CacheProvider

通过实现net.sf.hibernate.cache.CacheProvider接口,你可以整合一个JVM级别(或者集群的)缓存进来。你可以通过hibernate.cache.provider_class选择某个子定义的实现。

3.5.8. 事务策略

如果你希望使用Hibernate的Transaction API,你必须通过hibernate.transaction.factory_class属性指定一个Transaction实例的工厂类。 内置的两个标准选择是:

net.sf.hibernate.transaction.JDBCTransactionFactory

使用数据库(JDBC)事务

net.sf.hibernate.transaction.JTATransactionFactory

使用JTA(假若已经存在一个事务,Session会在这个上下文中工作,否则会启动一个新的事务。)

你也可以自行定义你的事务策略(比如说,一个CORBA事务服务)。

如果你希望在JTA环境中为可变数据使用JVM级别的缓存,你必须指定一个获取JTA TransactionManager的策略。

Table 3.5. JTA TransactionManagers

事务工厂类 Application Server
net.sf.hibernate.transaction.JBossTransactionManagerLookup JBoss
net.sf.hibernate.transaction.WeblogicTransactionManagerLookup Weblogic
net.sf.hibernate.transaction.WebSphereTransactionManagerLookup WebSphere
net.sf.hibernate.transaction.OrionTransactionManagerLookup Orion
net.sf.hibernate.transaction.ResinTransactionManagerLookup Resin
net.sf.hibernate.transaction.JOTMTransactionManagerLookup JOTM
net.sf.hibernate.transaction.JOnASTransactionManagerLookup JOnAS
net.sf.hibernate.transaction.JRun4TransactionManagerLookup JRun4

3.5.9. 绑定SessionFactory到JNDI

假若你希望把SessionFactory绑定到一个JNDI命名空间,用hibernate.session_factory_name这个属性指定一个名字(比如,java:comp/env/hibernate/SessionFactory)。如果这个属性省略了,SessionFactory不会被绑定到JNDI。(在一个只读的JNDI默认值实现的环境中,这特别有用。比如,Tomcat。)

当把SessionFactory 绑定到JNDI,Hibernate会使用hibernate.jndi.url,hibernate.jndi.class的值来获得一个初始化上下文的实例。如果他们没有指定,就会使用默认的InitialContext。

如果你选择使用JNDI,EJB或者其他工具类就可以通过JNDI查询得到SessionFactory。

3.5.10. 查询语言替换

你可以使用hibernate.query.substitutions定义新的Hibernate查询短语。比如说:

hibernate.query.substitutions true=1, false=0

会在生成的SQL中把短语true和 false替换成整数值。

hibernate.query.substitutions toLowercase=LOWER

这可以让你重新命名SQL的LOWER函数。