第 4 章配置.docx
- 文档编号:10027186
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:23
- 大小:29.41KB
第 4 章配置.docx
《第 4 章配置.docx》由会员分享,可在线阅读,更多相关《第 4 章配置.docx(23页珍藏版)》请在冰豆网上搜索。
第4章配置
第 4 章 配置
由于Hibernate是为了能在各种不同环境下工作而设计的,因此存在着大量的配置参数.幸运的是多数配置参数都有比较直观的默认值,并有随Hibernate一同分发的配置样例hibernate.properties(位于etc/)来展示各种配置选项.所需做的仅仅是将这个样例文件复制到类路径(classpath)下做一些自定义的修改.
4.1. 可编程的配置方式
一个org.hibernate.cfg.Configuration实例代表了一个应用程序中Java类型到SQL数据库映射的完整集合.Configuration被用来构建一个(不可变的(immutable))SessionFactory.映射定义则由不同的XML映射定义文件编译而来.
你可以直接实例化Configuration来获取一个实例,并为它指定XML映射定义文件.如果映射定义文件在类路径(classpath)中,请使用addResource():
Configurationcfg=newConfiguration()
.addResource("Item.hbm.xml")
.addResource("Bid.hbm.xml");
一个替代方法(有时是更好的选择)是,指定被映射的类,让Hibernate帮你寻找映射定义文件:
Configurationcfg=newConfiguration()
.addClass(org.hibernate.auction.Item.class)
.addClass(org.hibernate.auction.Bid.class);
Hibernate将会在类路径(classpath)中寻找名字为/org/hibernate/auction/Item.hbm.xml和/org/hibernate/auction/Bid.hbm.xml映射定义文件.这种方式消除了任何对文件名的硬编码(hardcoded).
Configuration也允许你指定配置属性:
Configurationcfg=newConfiguration()
.addClass(org.hibernate.auction.Item.class)
.addClass(org.hibernate.auction.Bid.class)
.setProperty("hibernate.dialect","org.hibernate.dialect.MySQLInnoDBDialect")
.setProperty("hibernate.connection.datasource","java:
comp/env/jdbc/test")
.setProperty("hibernate.order_updates","true");
当然这不是唯一的传递Hibernate配置属性的方式,其他可选方式还包括:
∙传一个java.util.Properties实例给Configuration.setProperties().
∙将hibernate.properties放置在类路径(classpath)的根目录下(rootdirectory).
∙通过java-Dproperty=value来设置系统(System)属性.
∙在hibernate.cfg.xml中加入元素
如果想尽快体验Hbernate,hibernate.properties是最简单的方式.
Configuration实例是一个启动期间(startup-time)的对象,一旦SessionFactory创建完成它就被丢弃了.
4.2. 获得SessionFactory
当所有映射定义被Configuration解析后,应用程序必须获得一个用于构造Session实例的工厂.这个工厂将被应用程序的所有线程共享:
SessionFactorysessions=cfg.buildSessionFactory();
Hibernate允许你的应用程序创建多个SessionFactory实例.这对使用多个数据库的应用来说很有用.
4.3. JDBC连接
通常你希望SessionFactory来为你创建和缓存(pool)JDBC连接.如果你采用这种方式,只需要如下例所示那样,打开一个Session:
Sessionsession=sessions.openSession();//openanewSession
一旦你需要进行数据访问时,就会从连接池(connectionpool)获得一个JDBC连接.
为了使这种方式工作起来,我们需要向Hibernate传递一些JDBC连接的属性.所有Hibernate属性的名字和语义都在org.hibernate.cfg.Environment中定义.我们现在将描述JDBC连接配置中最重要的设置.
如果你设置如下属性,Hibernate将使用java.sql.DriverManager来获得(和缓存)JDBC连接:
表 4.1. HibernateJDBC属性
属性名
用途
hibernate.connection.driver_class
jdbc驱动类
hibernate.connection.url
jdbcURL
hibernate.connection.username
数据库用户
hibernate.connection.password
数据库用户密码
hibernate.connection.pool_size
连接池容量上限数目
但Hibernate自带的连接池算法相当不成熟.它只是为了让你快些上手,不适合用于产品系统或性能测试中。
出于最佳性能和稳定性考虑你应该使用第三方的连接池。
只需要连接池的特定设置替换hibernate.connection.pool_size。
这将关闭Hibernate自带的连接池.例如,你可能会想用C3P0.
C3P0是一个随Hibernate一同分发的开源的JDBC连接池,它位于lib目录下。
如果你设置了hibernate.c3p0.*相关的属性,Hibernate将使用C3P0ConnectionProvider来缓存JDBC连接.如果你更原意使用Proxool,请参考发行包中的hibernate.properties并到Hibernate网站获取更多的信息.
这是一个使用C3P0的hibernate.properties样例文件:
hibernate.connection.driver_class=org.postgresql.Driver
hibernate.connection.url=jdbc:
postgresql:
//localhost/mydatabase
hibernate.connection.username=myuser
hibernate.connection.password=secret
hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
为了能在应用程序服务器(applicationserver)中使用Hibernate,你应当总是将Hibernate配置成注册在JNDI中的Datasource处获得连接,你至少需要设置下列属性中的一个:
表 4.2. Hibernate数据源属性
属性名
用途
hibernate.connection.datasource
数据源JNDI名字
hibernate.jndi.url
JNDI提供者的URL(可选)
hibernate.jndi.class
JNDIInitialContextFactory类(可选)
hibernate.connection.username
数据库用户(可选)
hibernate.connection.password
数据库用户密码(可选)
这里有一个使用应用程序服务器JNDI数据源的hibernate.properties样例文件:
hibernate.connection.datasource=java:
/comp/env/jdbc/test
hibernate.transaction.factory_class=\
org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.manager_lookup_class=\
org.hibernate.transaction.JBossTransactionManagerLookup
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
从JNDI数据源获得的JDBC连接将自动参与应用程序服务器中容器管理的事务(container-managedtransactions)中去.
任何连接(connection)配置属性的属性名要以"hibernate.connnection"前缀开头.例如,你可能会使用hibernate.connection.charSet来指定charSet.
通过实现org.hibernate.connection.ConnectionProvider接口,你可以定义属于你自己的获得JDBC连接的插件策略。
通过设置hibernate.connection.provider_class,你可以选择一个自定义的实现.
4.4. 可选的配置属性
有大量属性能用来控制Hibernate在运行期的行为.它们都是可选的,并拥有适当的默认值.
警告:
其中一些属性是"系统级(system-level)的".系统级属性可以通过java-Dproperty=value或hibernate.properties来设置,而不能用上面描述的其他方法来设置.
表 4.3. Hibernate配置属性
属性名
用途
hibernate.dialect
一个HibernateDialect类名允许Hibernate针对特定的关系数据库生成优化的SQL.
取值full.classname.of.Dialect
hibernate.show_sql
输出所有SQL语句到控制台.
取值true|false
hibernate.default_schema
在生成的SQL中,将给定的schema/tablespace附加于非全限定名的表名上.
取值SCHEMA_NAME
hibernate.default_catalog
在生成的SQL中,将给定的catalog附加于没全限定名的表名上.
取值CATALOG_NAME
hibernate.session_factory_name
SessionFactory创建后,将自动使用这个名字绑定到JNDI中.
取值jndi/composite/name
hibernate.max_fetch_depth
为单向关联(一对一,多对一)的外连接抓取(outerjoinfetch)树设置最大深度.值为0意味着将关闭默认的外连接抓取.
取值建议在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_identifer_rollback
如果开启,在对象被删除时生成的标识属性将被重设为默认值.
取值true|false
hibernate.use_sql_comments
如果开启,Hibernate将在SQL中生成有助于调试的注释信息,默认值为false.
取值true|false
表 4.4. HibernateJDBC和连接(connection)属性
属性名
用途
hibernate.jdbc.fetch_size
非零值,指定JDBC抓取数量的大小(调用Statement.setFetchSize()).
hibernate.jdbc.batch_size
非零值,允许Hibernate使用JDBC2的批量更新.
取值建议取5到30之间的值
hibernate.jdbc.batch_versioned_data
如果你想让你的JDBC驱动从executeBatch()返回正确的行计数,那么将此属性设为true(开启这个选项通常是安全的).同时,Hibernate将为自动版本化的数据使用批量DML.默认值为false.
eg.true|false
hibernate.jdbc.factory_class
选择一个自定义的Batcher.多数应用程序不需要这个配置属性.
eg.classname.of.Batcher
hibernate.jdbc.use_scrollable_resultset
允许Hibernate使用JDBC2的可滚动结果集.只有在使用用户提供的JDBC连接时,这个选项才是必要的,否则Hibernate会使用连接的元数据.
取值true|false
hibernate.jdbc.use_streams_for_binary
在JDBC读写binary(二进制)或serializable(可序列化)的类型时使用流(stream)(系统级属性).
取值true|false
hibernate.jdbc.use_get_generated_keys
在数据插入数据库之后,允许使用JDBC3PreparedStatement.getGeneratedKeys()来获取数据库生成的key(键)。
需要JDBC3+驱动和JRE1.4+,如果你的数据库驱动在使用Hibernate的标识生成器时遇到问题,请将此值设为false.默认情况下将使用连接的元数据来判定驱动的能力.
取值true|false
hibernate.connection.provider_class
自定义ConnectionProvider的类名,此类用来向Hibernate提供JDBC连接.
取值classname.of.ConnectionProvider
hibernate.connection.isolation
设置JDBC事务隔离级别.查看java.sql.Connection来了解各个值的具体意义,但请注意多数数据库都不支持所有的隔离级别.
取值1,2,4,8
hibernate.connection.autocommit
允许被缓存的JDBC连接开启自动提交(autocommit)(不建议).
取值true|false
hibernate.connection.release_mode
指定Hibernate在何时释放JDBC连接.默认情况下,直到Session被显式关闭或被断开连接时,才会释放JDBC连接.对于应用程序服务器的JTA数据源,你应当使用after_statement,这样在每次JDBC调用后,都会主动的释放连接.对于非JTA的连接,使用after_transaction在每个事务结束时释放连接是合理的.auto将为JTA和CMT事务策略选择after_statement,为JDBC事务策略选择after_transaction.
取值on_close|after_transaction|after_statement|auto
hibernate.connection.
将JDBC属性propertyName传递到DriverManager.getConnection()中去.
hibernate.jndi.
将属性propertyName传递到JNDIInitialContextFactory中去.
表 4.5. Hibernate缓存属性
属性名
用途
hibernate.cache.provider_class
自定义的CacheProvider的类名.
取值classname.of.CacheProvider
hibernate.cache.use_minimal_puts
以频繁的读操作为代价,优化二级缓存来最小化写操作.在Hibernate3中,这个设置对的集群缓存非常有用,对集群缓存的实现而言,默认是开启的.
取值true|false
hibernate.cache.use_query_cache
允许查询缓存,个别查询仍然需要被设置为可缓存的.
取值true|false
hibernate.cache.use_second_level_cache
能用来完全禁止使用二级缓存.对那些在类的映射定义中指定
取值true|false
hibernate.cache.query_cache_factory
自定义的实现QueryCache接口的类名,默认为内建的StandardQueryCache.
取值classname.of.QueryCache
hibernate.cache.region_prefix
二级缓存区域名的前缀.
取值prefix
hibernate.cache.use_structured_entries
强制Hibernate以更人性化的格式将数据存入二级缓存.
取值true|false
表 4.6. Hibernate事务属性
属性名
用途
hibernate.transaction.factory_class
一个TransactionFactory的类名,用于HibernateTransactionAPI(默认为JDBCTransactionFactory).
取值classname.of.TransactionFactory
jta.UserTransaction
一个JNDI名字,被JTATransactionFactory用来从应用服务器获取JTAUserTransaction.
取值jndi/composite/name
hibernate.transaction.manager_lookup_class
一个TransactionManagerLookup的类名-当使用JVM级缓存,或在JTA环境中使用hilo生成器的时候需要该类.
取值classname.of.TransactionManagerLookup
hibernate.transaction.flush_before_completion
如果开启,session在事务完成后将被自动清洗(flush).(在Hibernate和CMT一起使用时很有用.)
取值true|false
hibernate.transaction.auto_close_session
如果开启,session在事务完成后将被自动关闭.(在Hibernate和CMT一起使用时很有用.)
取值true|false
表 4.7. 其他属性
属性名
用途
hibernate.query.factory_class
选择HQL解析器的实现.
取值org.hibernate.hql.ast.ASTQueryTranslatorFactoryororg.hibernate.hql.classic.ClassicQueryTranslatorFactory
hibernate.query.substitutions
将Hibernate查询中的符号映射到SQL查询中的符号(符号可能是函数名或常量名字).
取值hqlLiteral=SQL_LITERAL,hqlFunction=SQLFUNC
hibernate.hbm2ddl.auto
在SessionFactory创建时,自动将数据库schema的DDL导出到数据库.使用create-drop时,在显式关闭SessionFactory时,将drop掉数据库schema.
取值update|create|create-drop
hibernate.cglib.use_reflection_optimizer
开启CGLIB来替代运行时反射机制(系统级属性).反射机制有时在除错时比较有用.注意即使关闭这个优化,Hibernate还是需要CGLIB.你不能在hibernate.cfg.xml中设置此属性.
取值true|false
4.4.1. SQL方言
你应当总是为你的数据库属性hibernate.dialect设置正确的org.hibernate.dialect.Dialect子类.如果你指定一种方言,Hibernate将为上面列出的一些属性使用合理的默认值,为你省去了手工指定它们的功夫.
表 4.8. HibernateSQL方言(hibernate.dialect)
RDBMS
方言
DB2
org.hibernate.dialect.DB2Dialect
DB2AS/400
org.hibernate.dialect.DB2400Dialect
DB2OS390
org.hibernate.dialect.DB2390Dialect
PostgreSQL
org.hibernate.dialect.PostgreSQLDialect
MySQL
org.hibernate.dialect.MySQLDialect
MySQLwithInnoDB
org.hibernate.dialect.MySQLInnoDBDialect
MySQLwithMyISAM
org.hibernate
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 配置
![提示](https://static.bdocx.com/images/bang_tan.gif)