SessionFactory配置.docx

上传人:b****8 文档编号:11345939 上传时间:2023-02-28 格式:DOCX 页数:10 大小:20.01KB
下载 相关 举报
SessionFactory配置.docx_第1页
第1页 / 共10页
SessionFactory配置.docx_第2页
第2页 / 共10页
SessionFactory配置.docx_第3页
第3页 / 共10页
SessionFactory配置.docx_第4页
第4页 / 共10页
SessionFactory配置.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

SessionFactory配置.docx

《SessionFactory配置.docx》由会员分享,可在线阅读,更多相关《SessionFactory配置.docx(10页珍藏版)》请在冰豆网上搜索。

SessionFactory配置.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1