📄 session-configuration.html
字号:
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>第 3 章 配置 </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 章 体系结构(Architecture)"><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 章 配置 </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 章 配置 </h2></div></div><div></div></div><p> 由于Hibernate是为了能在各种不同环境下工作而设计的, 因此存在着大量的配置参数. 幸运的是多数配置参数都 有比较直观的默认值, 并有随Hibernate一同分发的配置样例<tt class="literal">hibernate.properties</tt> (位于<tt class="literal">etc/</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">org.hibernate.cfg.Configuration</tt>实例代表了一个应用程序中Java类型 到SQL数据库映射的完整集合. <tt class="literal">Configuration</tt>被用来构建一个(不可变的 (immutable))<tt class="literal">SessionFactory</tt>. 映射定义则由不同的XML映射定义文件编译而来. </p><p> 你可以直接实例化<tt class="literal">Configuration</tt>来获取一个实例,并为它指定XML映射定义 文件. 如果映射定 义文件在类路径(classpath)中, 请使用<tt class="literal">addResource()</tt>: </p><pre class="programlisting">Configuration cfg = new Configuration() .addResource("Item.hbm.xml") .addResource("Bid.hbm.xml");</pre><p> 一个替代方法(有时是更好的选择)是,指定被映射的类,让Hibernate帮你寻找映射定义文件: </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/auction/Item.hbm.xml</tt>和 <tt class="literal">/org/hibernate/auction/Bid.hbm.xml</tt>映射定义文件. 这种方式消除了任何对文件名的硬编码(hardcoded). </p><p> <tt class="literal">Configuration</tt>也允许你指定配置属性: </p><pre class="programlisting">Configuration cfg = new Configuration() .addClass(org.hibernate.auction.Item.class) .addClass(org.hibernate.auction.Bid.class) .setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect") .setProperty("hibernate.connection.datasource", "java:comp/env/jdbc/test") .setProperty("hibernate.order_updates", "true");</pre><p> 当然这不是唯一的传递Hibernate配置属性的方式, 其他可选方式还包括: </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> 将<tt class="literal">hibernate.properties</tt>放置在类路径(classpath)的根目录下 (root directory). </p></li><li><p> 通过<tt class="literal">java -Dproperty=value</tt>来设置系统 (<tt class="literal">System</tt>)属性. </p></li><li><p> 在<tt class="literal">hibernate.cfg.xml</tt>中加入元素 <tt class="literal"><property></tt> (稍后讨论). </p></li></ol></div><p> 如果想尽快体验Hibernate, <tt class="literal">hibernate.properties</tt>是最简单的方式. </p><p> <tt class="literal">Configuration</tt>实例被设计成启动期间(startup-time)对象, 一旦<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-hibernatejdbc"></a>3.3. JDBC连接 </h2></div></div><div></div></div><p> 通常你希望<tt class="literal">SessionFactory</tt>来为你创建和缓存(pool)JDBC连接. 如果你采用这种方式, 只需要如下例所示那样,打开一个<tt class="literal">Session</tt>: </p><pre class="programlisting">Session session = sessions.openSession(); // open a new Session</pre><p> 一旦你需要进行数据访问时, 就会从连接池(connection pool)获得一个JDBC连接. </p><p> 为了使这种方式工作起来, 我们需要向Hibernate传递一些JDBC连接的属性. 所有Hibernate属性的名字和语义都在<tt class="literal">org.hibernate.cfg.Environment</tt>中定义. 我们现在将描述JDBC连接配置中最重要的设置. </p><p> 如果你设置如下属性,Hibernate将使用<tt class="literal">java.sql.DriverManager</tt>来获得(和缓存)JDBC连接 : </p><div class="table"><a name="d0e2006"></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>即可。这将关闭Hibernate自带的连接池. 例如, 你可能会想用C3P0. </p><p> C3P0是一个随Hibernate一同分发的开源的JDBC连接池, 它位于<tt class="literal">lib</tt>目录下。 如果你设置了<tt class="literal">hibernate.c3p0.*</tt>相关的属性, Hibernate将使用 <tt class="literal">C3P0ConnectionProvider</tt>来缓存JDBC连接. 如果你更原意使用Proxool, 请参考发 行包中的<tt class="literal">hibernate.properties</tt>并到Hibernate网站获取更多的信息. </p><p> 这是一个使用C3P0的<tt class="literal">hibernate.properties</tt>样例文件:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -