下面是一些在运行时可以改变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 |
你总是可以为你的数据库设置一个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 |
如果你的数据库支持ANSI或者Oracle风格的外连接,外连接抓取可能提高性能,因为可以限制和数据库交互的数量(代价是数据库自身进行了更多的工作)。外连接抓取允许你在一个select语句中就可以得到一个由多对一或者一对一连接构成的对象图。
默认情况下,抓取在叶对象,拥有代理的对象或者产生对自身的引用时终止。对一个特定关联来说,通过在XML映射文件中设置outer-join属性可以控制是否开启抓取功能。也可以设置hibernate.use_outer_join为false来全局关闭此功能。 你也可以通过hibernate.max_fetch_depth来设置抓取得对象图的最大深度。
Oracle限制通过它的JDBC驱动传递的byte数组的大小。如果你希望使用很大数量的binary或者serializable 类型的话,你需要打开hibernate.jdbc.use_streams_for_binary。这只能通过JVM级别设定
hibernate.show_sql强制Hibernate把每一句SQL语句都写到控制台。这是作为打开log的一个简易替代。
你可以自定义你的获取JDBC连接的策略,只需要实现net.sf.hibernate.connection.ConnectionProvider接口。在hibernate.connection.provider_class设置你自己的实现的类名。
几个配置属性影响除了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。
通过实现net.sf.hibernate.cache.CacheProvider接口,你可以整合一个JVM级别(或者集群的)缓存进来。你可以通过hibernate.cache.provider_class选择某个子定义的实现。
如果你希望使用Hibernate的Transaction API,你必须通过hibernate.transaction.factory_class属性指定一个Transaction实例的工厂类。 内置的两个标准选择是:
使用数据库(JDBC)事务
使用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 |
假若你希望把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。
你可以使用hibernate.query.substitutions定义新的Hibernate查询短语。比如说:
hibernate.query.substitutions true=1, false=0
会在生成的SQL中把短语true和 false替换成整数值。
hibernate.query.substitutions toLowercase=LOWER
这可以让你重新命名SQL的LOWER函数。