Hibernate中SessionFactory配置收藏

1.可编程配置方式

net.sf.hibernate.cfg.Configuration的一个实例代表了应用程序中所有的Java类到SQL数据库的映射的集合。Configuration用于构造一个(不可变的)SessionFactory。这些映射是从一些XML映射文件中编译得来的。

你可以得到一个Configuration的实例,直接实例化它即可。下面有一个例子,用来从两个XML配置文件(位于classpath)中的映射中初始化:

Configurationcfg=newConfiguration()

.addFile("Item.hbm.xml")

.addFile("Bid.hbm.xml");另外一个(某些时候更好的)方法是让Hibernate自行用getResourceAsStream()来装载映射文件。

Configurationcfg=newConfiguration()

.addClass(org.hibernate.auction.Item.class)

.addClass(org.hibernate.auction.Bid.class);Hibernate就会在classpath中寻找叫做/org/hibernate/autcion/Item.hbm.xml、/org/hibernate/autcion/Bid.hbm.xml的映射文件。这种方法取消了所有对文件名的硬编码。

Configuration也可以指定一些可选的配置项:

Propertiesprops=newProperties();

...

Configurationcfg=newConfiguration()

.addClass(org.hibernate.auction.Item.class)

.addClass(org.hibernate.auction.Bid.class)

.setProperties(props);Configuration是仅在配置期使用的对象,从第一个SessionFactory开始建立的时候,它就失效了。

2.获取SessionFactory

当所有的映射都被Configuration解析之后,应用程序为了得到Session实例,必须先得到它的工厂。这个工厂应该是被应用程序的所有线程共享的:

SessionFactorysessions=cfg.buildSessionFactory();当然,Hibernate并不禁止你的程序实例化多个SessionFactory。在你使用不止一个数据库的时候,这就有用了。

3.用户自行提供JDBC连接

SessionFactory可以使用一个用户自行提供的JDBC连接来打开一个Session。这种设计可以让应用程序来自己管理JDBC连接:

java.sql.Connectionconn=datasource.getConnection();

Sessionsession=sessions.openSession(conn);

//dosomedataaccesswork应用程序必须小心,不能在同一个连接上打开两个并行的session!

4.Hibernate提供的JDBC连接另一种方法就是,你可以让SessionFactory替你打开连接。SessionFactory必须事先知道JDBC连接的参数,有几种不同的方法设置参数:

传递一个java.util.Properties到Configuration.setProperties()方法。

在classpath的根目录中提供hibernate.properties文件。

通过java-Dproperty=value指定使用系统属性。

在hibernate.cfg.xml文件中包含<property>元素。详情见后。

如果你使用这种方法,打开一个Session是非常简单的:

Sessionsession=sessions.openSession();//openanewSession

//dosomedataaccesswork,aJDBCconnectionwillbeusedondemand所有的Hibernate属性名和约束都在net.sf.hibernate.cfg.Environment类中定义。我们讨论一下JDBC连接配置最重要的几项设置:

假若你设置了如下的属性,Hibernate会使用java.sql.DriverManager来得到连接,并建立连接池:

表3.1.HibernateJDBC属性

属性名用途

hibernate.connection.driver_classjdbc驱动类

hibernate.connection.urljdbcURL

hibernate.connection.username数据库用户名

hibernate.connection.password数据库用户密码

hibernate.connection.pool_size连接池容量最大数

Hibernate的连接池算法是非常可配置的。它的用途是让你上手,但是并非让你在生产系统中使用的,甚至不是用来做性能测试的。如果为了得到最好的性能和可靠性需要使用第三方的池,请用你连接池特定的设置来取代hibernate.connection.pool_size属性。

C3P0是随Hibernate发行包一起发布的一个开放源代码JDBC连接池,你可以在lib目录中找到。假若你设置了hibernate.c3p0.*属性,Hibernate会使用内置的C3P0ConnectionProvider作为连接池。对ApacheDBCP和Proxool的支持也是内置的。你必须设置hibernate.dbcp.*属性(DBCP连接池属性)来打开DBCPConnectionProvider。如果打开hibernate.dbcp.ps.*(DBCP语句缓存属性)可以使用Preparedstatement缓存(高度推荐)。要知道它们的含义,请查阅Apachecommons-pool的文档。如果你想要用Proxool,你需要设置hibernate.proxool.*系列属性。

下面是使用C3P0的一个例子:

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=net.sf.hibernate.dialect.PostgreSQLDialect在ApplicationServer内使用时,Hibernate可以从JNDI中注册的javax.sql.Datasource取得连接。需要设置如下属性:

表3.2.Hibernate数据源(Datasource)属性

属性名用途

hibernate.connection.datasourcedatasourceJNDI名字

hibernate.jndi.urlJNDI提供者的URL(可选)

hibernate.jndi.classJNDIInitialContextFactory的类名(可选)

hibernate.connection.username数据库用户名(可选)

hibernate.connection.password数据库密码(可选)

下面是一个使用应用服务器提供的JNDI数据源的例子:

hibernate.connection.datasource=java:/comp/env/jdbc/MyDB

hibernate.transaction.factory_class=\

net.sf.hibernate.transaction.JTATransactionFactory

hibernate.transaction.manager_lookup_class=\

net.sf.hibernate.transaction.JBossTransactionManagerLookup

hibernate.dialect=\

net.sf.hibernate.dialect.PostgreSQLDialect从JNDI数据源获得的JDBC连接自动具有应用服务器的容器管理事务的特性。

可以通过"hibernate.connnection"开头的属性来设置特别的连接属性。比如,你可以通过hibernate.connnection.charSet来指定charSet。

通过实现net.sf.hibernate.connection.ConnectionProvider接口,你可以定义如何获得JDBC连接的策略。你可以通过设置hibernate.connection.provider_class来选择一个自定义的实现。

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

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

表3.3.Hibernate配置属性

属性名用途

hibernate.dialectHibernate方言(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允许使用外连接抓取。已经失效。请使用max_fetch_depth。

取值.true|false

hibernate.max_fetch_depth对单根联合(一对一,多对一),设置外连接抓取树的最大深度。如果是0将关闭默认的外连接抓取。

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

hibernate.jdbc.fetch_size一个非零值,用来决定JDBC的获取量大小。(会调用Statement.setFetchSize()).

hibernate.jdbc.batch_size一个非零值,会开启Hibernate使用JDBC2的批量更新功能

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

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

取值.true|false

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

取值.true|false

hibernate.jdbc.use_get_generated_keys允许使用JDBC3的PreparedStatement.getGeneratedKeys()在插入后获取数据库自身生成的key。需要JDBC3以上的驱动和JRE1.4以上,如果你的驱动和Hibernate关键字生成器一起使用有问题,请设为false。默认情况下,会用connection元数据根据驱动是否支持自动判断。

取值.true|false

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

取值.true|false

hibernate.jndi.<propertyName>把propertyName这个属性传递到JNDIInitialContextFactory去(可选)

hibernate.connection.isolation事务隔离级别(可选).请检查java.sql.Connection来得到取值的具体意义。注意大多数数据库不会支持所有的隔离级别。

取值.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打开查询缓存,每个查询仍然必须指明cacheable。

取值.true|false

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

取值.prefix

hibernate.transaction.factory_class指定一个自定义的TransactionFactory类名,HibernateTransactionAPI将会使用(默认是JDBCTransactionFactory)。

取值.classname.of.TransactionFactory

jta.UserTransactionJTATransactionFactory用来从应用服务器获取JTAUserTransaction的JNDI名

取值.jndi/composite/name

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

取值.classname.of.TransactionManagerLookup

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

取值.hqlLiteral=SQL_LITERAL,hqlFunction=SQLFUNC

hibernate.show_sql把所有的SQL语句都输出到控制台

取值.true|false

hibernate.hbm2ddl.auto在SessionFactory创建后,自动输出schema创建DDL语句到数据库.和create-drop同时使用的话,数据库schema会在SessionFactory显式关闭后被drop掉。

取值.update|create|create-drop

相关推荐