⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hibernate2 参考文档之三.txt

📁 Hibernate使用说明书
💻 TXT
📖 第 1 页 / 共 2 页
字号:
Chapter 3. SessionFactory配置 
Prev     Next 

--------------------------------------------------------------------------------

Chapter 3. SessionFactory配置
因为Hibernate被设计为可以在许多不同环境下工作,所以它有很多配置参数。幸运的是,大部分都已经有默认值了,Hibernate发行包中还附带有示例的hibernate.properties文件,它演示了一些可变的参数。 

3.1. 可编程配置方式
net.sf.hibernate.cfg.Configuration的一个实例代表了应用程序中所有的Java类到关系数据库的映射的集合。这些映射是从一些XML映射文件中编译得来的。你可以得到一个Configuration的实例,直接实例化它即可。下面有一个例子,用来从两个XML配置文件中的映射中初始化: 

Configuration cfg = new Configuration()
    .addFile("Vertex.hbm.xml")
    .addFile("Edge.hbm.xml");
另外一个(或许是更好的)方法是让Hibernate自行用getResourceAsStream()来装载映射文件。 

Configuration cfg = new Configuration()
    .addClass(eg.Vertex.class)
    .addClass(eg.Edge.class);
Hibernate 就会在classpath中寻找叫做/eg/Vertex.hbm.xml、/eg/Edge.hbm.xml的映射文件。这种方法取消了所有对文件名的硬编码。 

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

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

3.2. 获取SessionFactory
当所有的映射都被Configuration解析之后,应用程序为了得到Session实例,必须先得到它的工厂。这个工厂应该是被应用程序的所有线程共享的。当然,Hibernate并不禁止你的程序实例化多个SessionFactory。在你使用不止一个数据库的时候,这就有用了。 

SessionFactory sessions = cfg.buildSessionFactory();
3.3. 用户自行提供JDBC连接
SessionFactory可以使用一个用户自行提供的JDBC连接来打开一个Session。这种设计可以让应用程序来自己管理JDBC连接。应用程序必须小心,不能在同一个连接上打开多个并行的session。 

java.sql.Connection conn = datasource.getConnection();
Session sess = sessions.openSession(conn);

// start a new transaction (optional)
Transaction tx = sess.beginTransaction();
上面的最后一行是可选的——应用程序也可能选择自行管理JTA或者JDBC事务。当然,假若你使用Hibernate Transaction,你的客户代码就可以从底层的实现中抽象出来了。(比如说,你可以将来在需要的时候切换到CORBA连接,而不需要更改程序代码。) 

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

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

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

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

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

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

Session sess = sessions.openSession(); // obtain a JDBC connection and
                                       // instantiate a new Session
// start a new transaction (optional)
Transaction tx = sess.beginTransaction();
所有的Hibernate属性名和约束都在net.sf.hibernate.cfg.Environment类中定义。我们讨论一下最重要的几项设置: 

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

Table 3.1. Hibernate JDBC属性

属性名 用途 
hibernate.connection.driver_class jdbc驱动类 
hibernate.connection.url jdbc URL 
hibernate.connection.username 数据库用户名 
hibernate.connection.password 数据库用户密码 
hibernate.connection.pool_size 连接池容量最大数 

Hibernate的连接池算法是非常可配置的。它的用途是让你上手,但是并非让你在生产系统中使用的,甚至不是用来做性能测试的。 

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

在Application Server内使用时,Hibernate可以从JNDI中注册的javax.sql.Datasource取得连接。需要设置如下属性: 

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

属性名 用途 
hibernate.connection.datasource datasource JNDI 名字 
hibernate.jndi.url JNDI 提供者的URL (可选)  
hibernate.jndi.class JNDI InitialContextFactory的类名 (可选)  
hibernate.connection.username 数据库用户名 (可选)  
hibernate.connection.password 数据库密码 (可选)  

3.5. 其它配置属性
下面是一些在运行时可以改变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 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -