📄 session-configuration.html
字号:
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>第 3 章 SessionFactory配置</title><link rel="stylesheet" href="../shared/css/html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.65.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="第 2 章 体系结构"><link rel="next" href="persistent-classes.html" title="第 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">第 3 章 SessionFactory配置</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="architecture.html">上一页</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="persistent-classes.html">下一页</a></td></tr></table><hr></div><div class="chapter" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title"><a name="session-configuration"></a>第 3 章 SessionFactory配置</h2></div></div><div></div></div><p> 因为Hibernate被设计为可以在许多不同环境下工作,所以它有很多配置参数。幸运的是,大部分都已经有默认值了,Hibernate发行包中还附带有示例的<tt class="literal">hibernate.properties</tt>文件,它演示了一些可变的参数。一般你只需要把这个文件放到你的classpath,配置一下即可。 </p><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="configuration-programmatic"></a>3.1. 可编程配置方式</h2></div></div><div></div></div><p> <tt class="literal">net.sf.hibernate.cfg.Configuration</tt>的一个实例代表了应用程序中所有的Java类到SQL数据库的映射的集合。<tt class="literal">Configuration</tt>用于构造一个(不可变的)<tt class="literal">SessionFactory</tt>。这些映射是从一些XML映射文件中编译得来的。 </p><p> 你可以得到一个<tt class="literal">Configuration</tt>的实例,直接实例化它即可。下面有一个例子,用来从两个XML配置文件(位于classpath)中的映射中初始化: </p><pre class="programlisting">Configuration cfg = new Configuration() .addFile("Item.hbm.xml") .addFile("Bid.hbm.xml");</pre><p> 另外一个(某些时候更好的)方法是让Hibernate自行用<tt class="literal">getResourceAsStream()</tt>来装载映射文件。 </p><pre class="programlisting">Configuration cfg = new Configuration() .addClass(org.hibernate.auction.Item.class) .addClass(org.hibernate.auction.Bid.class);</pre><p> Hibernate 就会在classpath中寻找叫做<tt class="literal">/org/hibernate/autcion/Item.hbm.xml</tt>、<tt class="literal">/org/hibernate/autcion/Bid.hbm.xml</tt>的映射文件。这种方法取消了所有对文件名的硬编码。 </p><p> <tt class="literal">Configuration</tt>也可以指定一些可选的配置项: </p><pre class="programlisting">Properties props = new Properties();...Configuration cfg = new Configuration() .addClass(org.hibernate.auction.Item.class) .addClass(org.hibernate.auction.Bid.class) .setProperties(props);</pre><p> <tt class="literal">Configuration</tt>是仅在配置期使用的对象,从第一个<tt class="literal">SessionFactory</tt>开始建立的时候,它就失效了。 </p></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="configuration-sessionfactory"></a>3.2. 获取SessionFactory</h2></div></div><div></div></div><p> 当所有的映射都被<tt class="literal">Configuration</tt>解析之后,应用程序为了得到<tt class="literal">Session</tt>实例,必须先得到它的工厂。这个工厂应该是被应用程序的所有线程共享的: </p><pre class="programlisting">SessionFactory sessions = cfg.buildSessionFactory();</pre><p> 当然,Hibernate并不禁止你的程序实例化多个<tt class="literal">SessionFactory</tt>。在你使用不止一个数据库的时候,这就有用了。 </p></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="configuration-userjdbc"></a>3.3. 用户自行提供JDBC连接</h2></div></div><div></div></div><p> <tt class="literal">SessionFactory</tt>可以使用一个用户自行提供的JDBC连接来打开一个<tt class="literal">Session</tt>。这种设计可以让应用程序来自己管理JDBC连接: </p><pre class="programlisting">java.sql.Connection conn = datasource.getConnection();Session session = sessions.openSession(conn);// do some data access work</pre><p> 应用程序必须小心,不能在同一个连接上打开两个并行的session! </p></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="configuration-hibernatejdbc"></a>3.4. Hibernate提供的JDBC连接</h2></div></div><div></div></div><p> 另一种方法就是,你可以让<tt class="literal">SessionFactory</tt>替你打开连接。<tt class="literal">SessionFactory</tt>必须事先知道JDBC连接的参数,有几种不同的方法设置参数: </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 session = sessions.openSession(); // open a new Session// do some data access work, a JDBC connection will be used on demand</pre><p> 所有的Hibernate属性名和约束都在<tt class="literal">net.sf.hibernate.cfg.Environment</tt>类中定义。我们讨论一下JDBC连接配置最重要的几项设置: </p><p> 假若你设置了如下的属性,Hibernate会使用<tt class="literal">java.sql.DriverManager</tt>来得到连接,并建立连接池: </p><div class="table"><a name="d0e770"></a><p class="title"><b>表 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>,甚至不是用来做性能测试的。如果为了得到最好的性能和可靠性需要使用第三方的池,请用你连接池特定的设置来取代<tt class="literal">hibernate.connection.pool_size</tt>属性。 </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">DBCPConnectionProvider</tt>。如果打开<tt class="literal">hibernate.dbcp.ps.*</tt> (DBCP 语句缓存属性)可以使用Prepared statement缓存(高度推荐)。要知道它们的含义,请查阅Apache commons-pool的文档。如果你想要用Proxool,你需要设置<tt class="literal">hibernate.proxool.*</tt>系列属性。 </p><p> 下面是使用C3P0的一个例子: </p><a name="c3p0-configuration"></a><pre class="programlisting">hibernate.connection.driver_class = org.postgresql.Driverhibernate.connection.url = jdbc:postgresql://localhost/mydatabasehibernate.connection.username = myuserhibernate.connection.password = secrethibernate.c3p0.min_size=5hibernate.c3p0.max_size=20hibernate.c3p0.timeout=1800hibernate.c3p0.max_statements=50hibernate.dialect = net.sf.hibernate.dialect.PostgreSQLDialect</pre><p> 在Application Server内使用时,Hibernate可以从JNDI中注册的<tt class="literal">javax.sql.Datasource</tt>取得连接。需要设置如下属性: </p><div class="table"><a name="d0e858"></a><p class="title"><b>表 3.2. Hibernate 数据源(Datasource)属性</b></p><table summary="Hibernate 数据源(Datasource)属性" border="1"><colgroup><col><col></colgroup><thead><tr><th>属性名</th><th>用途</th></tr></thead><tbody><tr><td><tt class="literal">hibernate.connection.datasource</tt></td><td><span class="emphasis"><em>datasource JNDI 名字</em></span></td></tr><tr><td><tt class="literal">hibernate.jndi.url</tt></td><td><span class="emphasis"><em>JNDI 提供者的URL</em></span> (可选) </td></tr><tr><td><tt class="literal">hibernate.jndi.class</tt></td><td><span class="emphasis"><em>JNDI <tt class="literal">InitialContextFactory</tt>的类名</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></tbody></table></div><p> 下面是一个使用应用服务器提供的JNDI数据源的例子:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -