📄 session-configuration.html
字号:
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Chapter 3. SessionFactory配置</title><link rel="stylesheet" href="../styles/html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.60.1"><link rel="home" href="index.html" title="HIBERNATE - 符合Java习惯的关系数据库持久化"><link rel="up" href="index.html" title="HIBERNATE - 符合Java习惯的关系数据库持久化"><link rel="previous" href="architecture.html" title="Chapter 2. 体系结构"><link rel="next" href="persistent-classes.html" title="Chapter 4. 持久化类(Persistent Classes)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 3. SessionFactory配置</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="architecture.html">Prev</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="persistent-classes.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="session-configuration"></a>Chapter 3. SessionFactory配置</h2></div></div><div></div></div><p> 因为Hibernate被设计为可以在许多不同环境下工作,所以它有很多配置参数。幸运的是,大部分都已经有默认值了,Hibernate发行包中还附带有示例的<tt class="literal">hibernate.properties</tt>文件,它演示了一些可变的参数。 </p><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="session-configuration-s1"></a>3.1. 可编程配置方式</h2></div></div><div></div></div><p> <tt class="literal">net.sf.hibernate.cfg.Configuration</tt>的一个实例代表了应用程序中所有的Java类到关系数据库的映射的集合。这些映射是从一些XML映射文件中编译得来的。你可以得到一个<tt class="literal">Configuration</tt>的实例,直接实例化它即可。下面有一个例子,用来从两个XML配置文件中的映射中初始化: </p><pre class="programlisting">Configuration cfg = new Configuration() .addFile("Vertex.hbm.xml") .addFile("Edge.hbm.xml");</pre><p> 另外一个(或许是更好的)方法是让Hibernate自行用<tt class="literal">getResourceAsStream()</tt>来装载映射文件。 </p><pre class="programlisting">Configuration cfg = new Configuration() .addClass(eg.Vertex.class) .addClass(eg.Edge.class);</pre><p> Hibernate 就会在classpath中寻找叫做<tt class="literal">/eg/Vertex.hbm.xml</tt>、<tt class="literal">/eg/Edge.hbm.xml</tt>的映射文件。这种方法取消了所有对文件名的硬编码。 </p><p> <tt class="literal">Configuration</tt>也可以指定一些可选的配置项。 </p><pre class="programlisting">Properties props = new Properties();...Configuration cfg = new Configuration() .addClass(eg.Vertex.class) .addClass(eg.Edge.class) .setProperties(props);</pre><p> <tt class="literal">Configuration</tt>是仅在配置期使用的对象,从第一个<tt class="literal">SessionFactory</tt>开始建立的时候,它就失效了。 </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="session-configuration-s2"></a>3.2. 获取SessionFactory</h2></div></div><div></div></div><p> 当所有的映射都被<tt class="literal">Configuration</tt>解析之后,应用程序为了得到<tt class="literal">Session</tt>实例,必须先得到它的工厂。这个工厂应该是被应用程序的所有线程共享的。当然,Hibernate并不禁止你的程序实例化多个<tt class="literal">SessionFactory</tt>。在你使用不止一个数据库的时候,这就有用了。 </p><pre class="programlisting">SessionFactory sessions = cfg.buildSessionFactory();</pre></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="session-configuration-s3"></a>3.3. 用户自行提供JDBC连接</h2></div></div><div></div></div><p> <tt class="literal">SessionFactory</tt>可以使用一个用户自行提供的JDBC连接来打开一个<tt class="literal">Session</tt>。这种设计可以让应用程序来自己管理JDBC连接。应用程序必须小心,不能在同一个连接上打开多个并行的session。 </p><pre class="programlisting">java.sql.Connection conn = datasource.getConnection();Session sess = sessions.openSession(conn);// start a new transaction (optional)Transaction tx = sess.beginTransaction();</pre><p> 上面的最后一行是可选的——应用程序也可能选择自行管理JTA或者JDBC事务。当然,假若你使用Hibernate <tt class="literal">Transaction</tt>,你的客户代码就可以从底层的实现中抽象出来了。(比如说,你可以将来在需要的时候切换到CORBA连接,而不需要更改程序代码。) </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="session-configuration-s4"></a>3.4. Hibernate提供的JDBC连接</h2></div></div><div></div></div><p> 另一种方法就是,你可以让<tt class="literal">SessionFactory</tt>替你打开连接。<tt class="literal">SessionFactory</tt>必须事先知道连接的参数,有几种不同的方法设置参数: </p><div class="orderedlist"><ol type="1" compact><li><p> 传递一个<tt class="literal">java.util.Properties</tt>到<tt class="literal">Configuration.setProperties()</tt>方法。 </p></li><li><p> 在classpath的根目录中提供<tt class="literal">hibernate.properties</tt>文件。 </p></li><li><p> 通过<tt class="literal">java -Dproperty=value</tt>指定使用<tt class="literal">系统属性</tt>。 </p></li><li><p> 在<tt class="literal">hibernate.cfg.xml</tt>文件中包含<tt class="literal"><property></tt>元素。详情见后。 </p></li></ol></div><p> 如果你使用这种方法,打开一个<tt class="literal">Session</tt>是非常简单的: </p><pre class="programlisting">Session sess = sessions.openSession(); // obtain a JDBC connection and // instantiate a new Session// start a new transaction (optional)Transaction tx = sess.beginTransaction();</pre><p> 所有的Hibernate属性名和约束都在<tt class="literal">net.sf.hibernate.cfg.Environment</tt>类中定义。我们讨论一下最重要的几项设置: </p><p> 假若你设置了如下的属性,Hibernate会使用<tt class="literal">java.sql.DriverManager</tt>来得到连接,并建立连接池: </p><div class="table"><a name="d0e756"></a><p class="title"><b>Table 3.1. Hibernate JDBC属性</b></p><table summary="Hibernate JDBC属性" border="1"><colgroup><col><col></colgroup><thead><tr><th>属性名</th><th>用途</th></tr></thead><tbody><tr><td><tt class="literal">hibernate.connection.driver_class</tt></td><td><span class="emphasis"><em>jdbc驱动类</em></span></td></tr><tr><td><tt class="literal">hibernate.connection.url</tt></td><td><span class="emphasis"><em>jdbc URL</em></span></td></tr><tr><td><tt class="literal">hibernate.connection.username</tt></td><td><span class="emphasis"><em>数据库用户名</em></span></td></tr><tr><td><tt class="literal">hibernate.connection.password</tt></td><td><span class="emphasis"><em>数据库用户密码</em></span></td></tr><tr><td><tt class="literal">hibernate.connection.pool_size</tt></td><td><span class="emphasis"><em>连接池容量最大数</em></span></td></tr></tbody></table></div><p> Hibernate的连接池算法是非常可配置的。它的用途是让你上手,但是<span class="emphasis"><em>并非让你在生产系统中使用的</em></span>,甚至不是用来做性能测试的。 </p><p> C3P0是随Hibernate发行包一起发布的一个开放源代码JDBC连接池,你可以在<tt class="literal">lib</tt> 目录中找到。假若你设置了<tt class="literal">hibernate.c3p0.*</tt> 属性,Hibernate会使用内置的<tt class="literal">C3P0ConnectionProvider</tt>作为连接池。 对Apache DBCP和Proxool的支持也是内置的。你必须设置<tt class="literal">hibernate.dbcp.*</tt>属性 (DBCP连接池属性)和<tt class="literal">hibernate.dbcp.ps.*</tt> (DBCP 语句缓存属性)才能使用<tt class="literal">DBCPConnectionProvider</tt>。要知道它们的含义,请查阅Apache commons-pool的文档。如果你想要用Proxool,你需要设置<tt class="literal">hibernate.proxool.*</tt>系列属性。 </p><p> 在Application Server内使用时,Hibernate可以从JNDI中注册的<tt class="literal">javax.sql.Datasource</tt>取得连接。需要设置如下属性:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -