SessionFactory配置.docx
《SessionFactory配置.docx》由会员分享,可在线阅读,更多相关《SessionFactory配置.docx(10页珍藏版)》请在冰点文库上搜索。
SessionFactory配置
第二章SessionFactory配置XML:
namespaceprefix=ons="urn:
schemas-microsoft-com:
Office:
office"/>
2.1系统配置
.NET.sf.hibernate.Configuration对象的实例描述了由应用程序的Java类型向关系数据库类型进行映射的完整集合。
这些映射从各式各样的XML映射文件编译而来。
你可以通过直接建立实例来获得Configuration对象的实例。
下面有一个从两个XML配置文件所定义的映射中建立数据存储的例子:
Configurationcfg=newConfiguration()
.addFile("vertex.hbm.xml")
.addFile("edge.hbm.xml");
另一个可供选择的方法(更好?
)是让Hibernate使用getResourceAsStream()来加载映射文件。
Configurationcfg=newConfiguration()
.addClass(eg.Vertex.class)
.addClass(eg.Edge.class);
调用后,Hibernate会自动在CLASSPATH中寻找名字为/eg/Vertex.hbm.xml和/eg/Edge.hbm.xml的映射文件。
这种方法消除了所有硬编码的文件名称。
系统配置也可以指定若干个可选的参数。
Propertiesprops=newProperties();
……
Configurationcfg=newConfiguration()
.addClass(eg.Vertex.class)
.addClass(eg.Edge.class)
.setProperties(props);
Configuration被设计成“配置过程”对象,一旦SessionFactory建立,配置对象就会被丢弃。
2.2获得SessionFactory
当所有的映射都通过Configuration解析后,应用程序程序必须为会话实例而获得一个会话工厂。
这个工厂被设计为被所有的应用线程所共享。
但是,Hibernate也允许你的应用程序实例化多个SessionFactory,这种特性在你使用多个数据库时,将非常有用。
SessionFactorysessions=cfg.buildSessionFactory();
2.3用户提供JdbC连接
SessionFactory能够在用户提供的JDBC上打开一个会话。
这种设计能够使应用程序自由选择其合意的JDBC连接。
应用程序必须注意,不能在同一个连接上打开两个并发会话。
java.sql.Connectionconn=datasource.getConnection();
Sessionsess=sessions.openSession(conn);
//startanewtransaction(optional)
Transactiontx=sess.beginTransaction();
最后一行在这里是可选的——应用程序能够选择直接利用JTA或JDBC的事务来管理事务。
然而,如果你使用Hibernate事务,你的客户端代码从底层实现中抽象出来。
(例如:
你可以在将来某个时间选择切换到Corba事务服务,而无需改变应用代码)
2.4Hibernate提供JDBC连接
另外一种选择,你能够使用SessionFactory来打开数据库连接,但是前提是必须按照下面的方法提供连接属性:
l 传递一个java.util.Properties实例给Configuration.setProperties()
l 将hibernate.properties文件放在CLASSPATH的根目录中
l 使用java-Dproperty=value来设置系统属性
l 在hibernate.cfg.xml文件中包含元素(见下文)
如果你设置了下面的属性,Hibernate将使用java.sql.driverManager来获得连接(或连接池):
hibernate.connection.driver_class=jdbcdriverclass
hibernate.connection.url=jdbcurl
hibernate.connection.username=databaseuser
hibernate.connection.password=userpassword
hibernate.connection.pool_size=maximumnumberofpooledconnections
hibernate.statement_cache.size=maximumnumberofcachedPreparedStatements(mustbe0forInterbase)
hibernate.connection.isolation=transactionisolationlevel(optional)
hibernate.connection.xxxx=passtheJDBCpropertyxxxxtoDriverManager.getConnection()
hibernate.connection.isolation必须指定一个整数值。
(查阅java.sql.Connection以获得该值的解释,但是大多数数据库都不支持所有的隔离层次)
通过定义以“hibernate.connnection”为前缀的属性名字,可以传递任何连接属性。
例如,你可以通过hibernate.connnection.charSet来指定charSet属性。
Hibernate自己的连接池运算法则根本没有开发。
C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布。
如果你设置下面的属性,Hibernate将使用C3P0来提供连接池功能:
hibernate.c3p0.max_size=maximumconnectionpoolsize
hibernate.c3p0.min_size=minimumconnectionpoolsize
hibernate.c3p0.timeout=maximumidletime
hibernate.c3p0.max_statements=sizeofstatementcache
不过,除了上面的设置以外你仍然需要设置hibernate.connection.driver_class,hibernate.connection.url,hibernate.connection.username和hibernate.connection.password属性。
Hibernate也内置支持apacheDBCP连接池。
你需要通过设置hibernate.dbcp.*属性(DBCP连接池属性)和hibernate.dbcp.ps.*(DBCP语句缓冲属性)来启用DBCPConnectionProvider。
请参考Apachecommons-pool的文档来获取这些属性的详细说明。
所有的Hibernate属性名字都定义在net.sf.hibernate.Environment类中。
如果用户使用内置的应用服务器,Hibernate也可以通过注册在JNDI中的javax.sql.Datasource来获得数据库连接。
设置下列属性:
hibernate.connection.datasource=datasourceJNDIname
hibernate.jndi.url=urloftheJNDIprovider(optional)
hibernate.jndi.class=classoftheJNDIInitialContextFactory(optional)
hibernate.jndi.xxxx=passthepropertyxxxxtotheJNDIInitialContextFactory(optional)
hibernate.connection.username=databaseuser
hibernate.connection.password=userpassword
然后,像下面一样简单地打开会话:
Sessionsess=sessions.openSession();//obtainaJDBCconnectionand
//instantiateanewSession
//startanewtransaction(optional)
Transactiontx=sess.beginTransaction();
2.5其他属性
还有一些可选的其它属性:
属性名字
属性值
说明
hibernate.dialect
full.classname.of.Dialect
classnameofaHibernateDialect-enablescertainplatfoRMdependentfeatures
hibernate.default_schema
SCHEMA_NAME
qualifyunqualifiedtablenameswiththegivenschema/tablespaceingeneratedSQL
hibernate.session_factory_namejndi/composite/namebindthisnametotheSessionFactory
hibernate.use_outer_join
true|false
enablesouterjoinfetching
hibernate.jdbc.fetch_size
anon-zerovalue
deteRminestheJDBCfetchsize(callsStatement.setFetchSize())
hibernate.jdbc.batch_size
recommendedvaluesbetween5and30anonzerovalue
enablesuseofJDBC2batchupdatesbyHibernate
hibernate.jdbc.use_scrollable_resultset
true|false
enablesuseofJDBC2scrollableresultsetsbyHibernate.Thispropertyisonlynecessarywhenusingusersuppliedconnections.Hibernateusesconnectionmetadataotherwise.
hibernate.jdbc.use_streams_for_binary
true|false
usestreamswhenwriting/readingbinaryorserializabletypesto/fromJDBC
hibernate.connection.provider_class
full.classname.of.ConnectionProvider
classnameofacustomConnectionProvider
hibernate.transaction.factory_class
full.classname.of.TransactionFactory
classnameofaTransactionFactorytousewithHibernateTransactionapi
jta.UserTransaction
ndi/composite/name
AJNDInameusedbyJTATransactionFactorytoobtaintheJTAUserTransaction
hibernate.transaction.manager_lookup_class
full.classname.of.TransactionManagerLookup
classnameofaTransactionManagerLookup-neededwhenJVM-levelcachingisenabledinaJTAenvironment
hibernate.query.imports
package.name,other.package.name
Alistofpackagescontainingpersistentclasses.Ifthepackageislistedhere,yourHibernatequeriesneednotspecifythefullclassnameofapersistentclass.(YoucanusefromfooinclassFooasanalternativetofromfooinclasseg.foo.Foo.)
hibernate.query.substitutions
hqlLiteral=SQL_LITERAL,hqlFunction=SQLFUNC
mappingfromtokensinHibernatequeriestoSQLtokens(tokensmightbefunctionorliteralnames,forexample)
hibernate.show_sql
true|false
writeallSQLstatementstoconsole(asanalternativetouseoftheloggingfunctionality)
你应该始终为了你的数据库而将hibernate.dialect属性设置为正确的net.sf.hibernate.dialect.Dialect子类。
除非你想使用native或sequence生成主键或者悲观锁定(Session.lock(),Session.loadWithLock()),否则这些设置基本上讲不需要很严格。
但是,如果你指定了dialect,Hibernate将智能地使用上述属性的默认设置。
保存你手工设置的结果。
下表列出了hibernate.dialect属性可选的值:
DB2net.sf.hibernate.dialect.DB2Dialect
MYSQLnet.sf.hibernate.dialect.MySQLDialect
SAPDBnet.sf.hibernate.dialect.SAPDBDialect
ORACLEnet.sf.hibernate.dialect.OracleDialect
Sybasenet.sf.hibernate.dialect.SybaseDialect
Progressnet.sf.hibernate.dialect.ProgressDialect
MckoiSQLnet.sf.hibernate.dialect.McKoiDialect
Interbasenet.sf.hibernate.dialect.InterbaseDialect
Pointbasenet.sf.hibernate.dialect.PointbaseDialect
PostgreSQLnet.sf.hibernate.dialect.PostgreSQLDialect
HypersonicSQLnet.sf.hibernate.dialect.HSQLDialect
MicrosoftSQLSERVERnet.sf.hibernate.dialect.SybaseDialect
如果你的数据库支持ANSI或Oracle类型的外部连接,则它会通过限制与数据库间数据往返的次数来提高外部连接获取结果的性能(这是以数据库执行更多的工作为代价的)。
使用外部连接获取的结果允许在单一的选择查询中得到多对一或一对一关系的对象图表。
获取的图表在对象换页、对象代理或循环参考发生时结束。
(Thefetchedgraphendsatleafobjects,objectswithproxiesorwherecircularreferencesoccur)。
这种特别的关联行为可以通过设置outer-join属性为false来禁止。
Oracle限制了数据库与JDBC驱动程序之间传递的字节数组的大小。
如果你想使用大的二进制类型或持续类型,你应该启动属性hibernate.jdbc.use_streams_for_binary。
而它仅仅是一个JVM级别的设置。
hibernate.show_sql属性强制Hibernate在控制台上显示SQL语句。
这种做法提供了一种的启用日志的简单选择。
你可以通过实现接口net.sf.hibernate.connection.ConnectionProvider来定义获取JDBC连接策略的插件。
你可以设置hibernate.connection.provider_class属性来设置自定义的实现。
如果你想使用Hibernates事务编程接口,你需要通过设置hibernate.transaction.factory_class属性来为事务实例指定工厂类。
有两种标准(内建)的选择:
net.sf.hibernate.transaction.JDBCTransactionFactory委派给JDBC事务
net.sf.hibernate.transaction.JTATransactionFactory委派给JTA(如果有事务正在执行,则会话会在他的上下文中执行任务,否则将启动一个新事务)
你还可以自定义事务。
如果你希望使用JTA环境中易变数据缓存(JVM级别),那你就必须指定获取JTATransactionManager的策略。
net.sf.hibernate.transaction.jbossTransactionManagerLookup forJBoss
net.sf.hibernate.transaction.webLOGICTransactionManagerLookup forWeblogic
net.sf.hibernate.transaction.websphereTransactionManagerLookupforWebSphere
net.sf.hibernate.transaction.OrionTransactionManagerLookup forOrion
net.sf.hibernate.transaction.ResinTransactionManagerLookup forResin
如果你希望将SessionFactory绑定到JNDI的名字空间,则可以使用属性hibernate.session_factory_name,并为它指定一个名字(如:
hibernate/session_factory)。
例:
今后EJBs就可以通过查找JNDI来获得SessionFactory。
Hibernate将使用hibernate.jndi.url、hibernate.jndi.class属性来建立初始的上下文环境。
用户能够使用hibernate.query.substitutions属性定义新的Hibernate查询符号。
例如:
hibernate.query.substitutionstrue=1,false=0
这在生成SQL语句时,会将“true”和“flase”符号翻译成整数字符。
hibernate.query.substitutionstoLowercase=LOWER
该句将使你重新命名SQL语句中的lower函数。
2.6XML配置文件
还有一种配置方法,就是将所有的配置信息设置在文件hibernate.cfg.xml中。
这个文件必须放在CLASSPATH的根目录中。
xmlversion='1.0'encoding='utf-8'?
>
DOCTYPEhibernate-configurationPUBLIC
"-//Hibernate/HibernateConfigurationDTD//EN"
"
--aSessionFactoryinstancelistedas/jndi/name-->
--properties-->
my/first/datasource
net.sf.hibernate.dialect.MySQLDialect
false
true
java:
comp/UserTransaction/
--mappingfiles-->
可以简单地按照下面的方法配置Hibernate:
SessionFactorysf=newConfiguration()
.configure()
.buildSessionFactory();
2.7日志
Hibernate使用Apachecommons-logging记录各种事件。
commons-logging日志服务将直接输出到Apachelog4(如果你将log4j.jar放置在CLASSPATH中)或jdk1.4logging中(如果运行在JDK1.4或以上版本上)。
你可以从下载log4j/">http