﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-记忆好很大程度决定能力!-文章分类-hibernate</title><link>http://www.blogjava.net/microlab4321/category/24783.html</link><description>适时总结是一种很好的彌补方法!</description><language>zh-cn</language><lastBuildDate>Fri, 21 Sep 2007 06:46:07 GMT</lastBuildDate><pubDate>Fri, 21 Sep 2007 06:46:07 GMT</pubDate><ttl>60</ttl><item><title>Hibernate学习笔记(6)之集合映射</title><link>http://www.blogjava.net/microlab4321/articles/147084.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Fri, 21 Sep 2007 05:36:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/147084.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/147084.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/147084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/147084.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/147084.html</trackback:ping><description><![CDATA[<span style="font-size: 18pt"><strong>集合映射</strong></span><br />
一.<strong>映射Set<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp; Set是一个集合接口，它的特性和数学上的集合有点类似，Set中存放的是对象的引用，继承自Collection借口.<br />
特性：&nbsp;&nbsp;&nbsp; 1:不允许存放重复元素。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2:元素是无序。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3:主要有HashSet,LinkedHashSet,TreeSet 3个实现Set接口的具体类。<br />
&nbsp;&nbsp;&nbsp;&nbsp; (1).<strong>HashSet</strong>按照特定的Hash算法存取对象，效率较高，存取对象的速度快。<br />
&nbsp;&nbsp;&nbsp;&nbsp; (2).<strong>LinkedHashSet</strong>是HashSet的子类，它使用链表数据结构存取，与HashSet不同之处在于LinkHashSet中的元素具有固定的顺序<br />
&nbsp;&nbsp; &nbsp; (3).TreeSet是一个具有排序功能的集合，实现了Sorted接口，在加入对象时，按照集合中的对象进行了排序。但加入用户自定义时，如Student类，则Student类需要实现Comparable接口排序。<br />
<br />
<strong>二.映射List</strong><br />
&nbsp;&nbsp; List是一个集合接口，他继承自Collection接口，List中存放的是对象的引用<br />
&nbsp;特性:&nbsp;&nbsp;&nbsp; 1.List中可以存放重复元素。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.List中的元素是一个有序的集合，可以通过索引访问List中的元素。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.List主要有ArryList和LinkedList实现Set接口的具体类。&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1).<strong>ArryList</strong>是一个可变的数组，它具有快速读取对象的特性，但是如果删除或者插入对象则效率较底；因为每次位置i插入一个对象时，从位置i+1到最后都要移一个位置；而每次删除位置i上的一个对象，从位置i+1到最后则要前移一个位置。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2).<strong>LinkedList</strong>在内部采用链表的形式存储数据，因此在删除和插入对象时会有较高的效率。如果经常需要在List中插入和删除数据，建议使用LinkList;如果List中的对象很少，建议使用ArrayList<br />
<br />
<strong>三.映射Bag</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; Bag并不是Java中的接口，它是Hibernate提供的集合，Bag中可以有重复的元素，但是Bag中的元素并没有排序。如果有大量的重复数据，&lt;Bag&gt;标签的效率比较低，它在更新数据时采用的是先删除要更新的数据，然后插入数据。使用&lt;ibag&gt;可以避免这种情况。<br />
<br />
<strong>四.映射Map</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; Map是java中的接口，它是一种重要的集合，它使用Key/value的方式存储数据. 
<img src ="http://www.blogjava.net/microlab4321/aggbug/147084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-09-21 13:36 <a href="http://www.blogjava.net/microlab4321/articles/147084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]Hibernate 参数设置一览表 </title><link>http://www.blogjava.net/microlab4321/articles/142256.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 03 Sep 2007 04:36:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/142256.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/142256.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/142256.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/142256.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/142256.html</trackback:ping><description><![CDATA[<div align="center"><font color="#ffffff"><font size="5"><strong><font color="#000000">Hibernate 参数设置一览表</font> </strong></font></font><br />
</div>
<font color="#ffffff"><br />
<br />
</font>
<table summary="                Hibernate配置属性&#13;&#10;    " border="1">
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.dialect</font> </tt></td>
            <td>一个Hibernate <tt class="literal"><font face="新宋体">Dialect</font></tt>类名允许Hibernate针对特定的关系数据库生成优化的SQL. <span class="strong">取值</span><tt class="literal"><font face="新宋体">full.classname.of.Dialect</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.show_sql</font> </tt></td>
            <td>输出所有SQL语句到控制台. 有一个另外的选择是把<tt class="literal"><font face="新宋体">org.hibernate.SQL</font></tt>这个log category设为<tt class="literal"><font face="新宋体">debug</font></tt>。 <span class="strong">eg.</span><tt class="literal"><font face="新宋体">true</font></tt> | <tt class="literal"><font face="新宋体">false</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.format_sql</font> </tt></td>
            <td>在log和console中打印出更漂亮的SQL。 <span class="strong">取值</span><tt class="literal"><font face="新宋体">true</font></tt> | <tt class="literal"><font face="新宋体">false</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.default_schema</font> </tt></td>
            <td>在生成的SQL中, 将给定的schema/tablespace附加于非全限定名的表名上. <span class="strong">取值</span><tt class="literal"><font face="新宋体">SCHEMA_NAME</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.default_catalog</font> </tt></td>
            <td>在生成的SQL中, 将给定的catalog附加于非全限定名的表名上. <span class="strong">取值</span><tt class="literal"><font face="新宋体">CATALOG_NAME</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.session_factory_name</font> </tt></td>
            <td><tt class="literal"><font face="新宋体">SessionFactory</font> </tt>创建后，将自动使用这个名字绑定到JNDI中. <span class="strong">取值</span><tt class="literal"><font face="新宋体">jndi/composite/name</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.max_fetch_depth</font> </tt></td>
            <td>为单向关联(一对一, 多对一)的外连接抓取（outer join fetch）树设置最大深度. 值为<tt class="literal"><font face="新宋体">0</font></tt>意味着将关闭默认的外连接抓取. <span class="strong">取值</span> 建议在<tt class="literal"><font face="新宋体">0</font></tt>到<tt class="literal"><font face="新宋体">3</font></tt>之间取值 </td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.default_batch_fetch_size</font> </tt></td>
            <td>为Hibernate关联的批量抓取设置默认数量. <span class="strong">取值</span> 建议的取值为<tt class="literal"><font face="新宋体">4</font></tt>, <tt class="literal"><font face="新宋体">8</font></tt>, 和<tt class="literal"><font face="新宋体">16</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.default_entity_mode</font> </tt></td>
            <td>为由这个<tt class="literal"><font face="新宋体">SessionFactory</font></tt>打开的所有Session指定默认的实体表现模式. <span class="strong">取值</span><tt class="literal"><font face="新宋体">dynamic-map</font></tt>, <tt class="literal"><font face="新宋体">dom4j</font></tt>, <tt class="literal"><font face="新宋体">pojo</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.order_updates</font> </tt></td>
            <td>强制Hibernate按照被更新数据的主键，为SQL更新排序。这么做将减少在高并发系统中事务的死锁。 <span class="strong">取值</span><tt class="literal"><font face="新宋体">true</font></tt> | <tt class="literal"><font face="新宋体">false</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.generate_statistics</font> </tt></td>
            <td>如果开启, Hibernate将收集有助于性能调节的统计数据. <span class="strong">取值</span><tt class="literal"><font face="新宋体">true</font></tt> | <tt class="literal"><font face="新宋体">false</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.use_identifer_rollback</font> </tt></td>
            <td>如果开启, 在对象被删除时生成的标识属性将被重设为默认值. <span class="strong">取值</span><tt class="literal"><font face="新宋体">true</font></tt> | <tt class="literal"><font face="新宋体">false</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.use_sql_comments</font> </tt></td>
            <td>如果开启, Hibernate将在SQL中生成有助于调试的注释信息, 默认值为<tt class="literal"><font face="新宋体">false</font></tt>. <span class="strong">取值</span><tt class="literal"><font face="新宋体">true</font></tt> | <tt class="literal"><font face="新宋体">false</font></tt></td>
        </tr>
    </tbody>
</table>
<div class="table"><a name="configuration-jdbc-properties"></a>
<p class="title"><strong>表&nbsp;3.4.&nbsp; Hibernate JDBC和连接(connection)属性 </strong></p>
<table summary="                Hibernate JDBC和连接(connection)属性&#13;&#10;    " border="1">
    <colgroup>
    <col>
    <col></colgroup>
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.jdbc.fetch_size</font> </tt></td>
            <td>非零值，指定JDBC抓取数量的大小 (调用<tt class="literal"><font face="新宋体">Statement.setFetchSize()</font></tt>). </td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.jdbc.batch_size</font> </tt></td>
            <td>非零值，允许Hibernate使用JDBC2的批量更新. <span class="strong">取值</span> 建议取<tt class="literal"><font face="新宋体">5</font></tt>到<tt class="literal"><font face="新宋体">30</font></tt>之间的值 </td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.jdbc.batch_versioned_data</font> </tt></td>
            <td>如果你想让你的JDBC驱动从<tt class="literal"><font face="新宋体">executeBatch()</font></tt>返回正确的行计数 , 那么将此属性设为<tt class="literal"><font face="新宋体">true</font></tt>(开启这个选项通常是安全的). 同时，Hibernate将为自动版本化的数据使用批量DML. 默认值为<tt class="literal"><font face="新宋体">false</font></tt>. <span class="strong">eg.</span><tt class="literal"><font face="新宋体">true</font></tt> | <tt class="literal"><font face="新宋体">false</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.jdbc.factory_class</font> </tt></td>
            <td>选择一个自定义的<tt class="literal"><font face="新宋体">Batcher</font></tt>. 多数应用程序不需要这个配置属性. <span class="strong">eg.</span><tt class="literal"><font face="新宋体">classname.of.Batcher</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.jdbc.use_scrollable_resultset</font> </tt></td>
            <td>允许Hibernate使用JDBC2的可滚动结果集. 只有在使用用户提供的JDBC连接时，这个选项才是必要的, 否则Hibernate会使用连接的元数据. <span class="strong">取值</span><tt class="literal"><font face="新宋体">true</font></tt> | <tt class="literal"><font face="新宋体">false</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.jdbc.use_streams_for_binary</font> </tt></td>
            <td>在JDBC读写<tt class="literal"><font face="新宋体">binary (二进制)</font></tt>或<tt class="literal"><font face="新宋体">serializable (可序列化)</font></tt> 的类型时使用流(stream)(系统级属性). <span class="strong">取值</span><tt class="literal"><font face="新宋体">true</font></tt> | <tt class="literal"><font face="新宋体">false</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.jdbc.use_get_generated_keys</font> </tt></td>
            <td>在数据插入数据库之后，允许使用JDBC3 <tt class="literal"><font face="新宋体">PreparedStatement.getGeneratedKeys()</font></tt> 来获取数据库生成的key(键)。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器时遇到问题，请将此值设为false. 默认情况下将使用连接的元数据来判定驱动的能力. <span class="strong">取值</span><tt class="literal"><font face="新宋体">true|false</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.connection.provider_class</font> </tt></td>
            <td>自定义<tt class="literal"><font face="新宋体">ConnectionProvider</font></tt>的类名, 此类用来向Hibernate提供JDBC连接. <span class="strong">取值</span><tt class="literal"><font face="新宋体">classname.of.ConnectionProvider</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.connection.isolation</font> </tt></td>
            <td>设置JDBC事务隔离级别. 查看<tt class="literal"><font face="新宋体">java.sql.Connection</font></tt>来了解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离级别. <span class="strong">取值</span><tt class="literal"><font face="新宋体">1, 2, 4, 8</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.connection.autocommit</font> </tt></td>
            <td>允许被缓存的JDBC连接开启自动提交(autocommit) (不建议). <span class="strong">取值</span><tt class="literal"><font face="新宋体">true</font></tt> | <tt class="literal"><font face="新宋体">false</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.connection.release_mode</font> </tt></td>
            <td>指定Hibernate在何时释放JDBC连接. 默认情况下,直到Session被显式关闭或被断开连接时,才会释放JDBC连接. 对于应用程序服务器的JTA数据源, 你应当使用<tt class="literal"><font face="新宋体">after_statement</font></tt>, 这样在每次JDBC调用后，都会主动的释放连接. 对于非JTA的连接, 使用<tt class="literal"><font face="新宋体">after_transaction</font></tt>在每个事务结束时释放连接是合理的. <tt class="literal"><font face="新宋体">auto</font></tt>将为JTA和CMT事务策略选择<tt class="literal"><font face="新宋体">after_statement</font></tt>, 为JDBC事务策略选择<tt class="literal"><font face="新宋体">after_transaction</font></tt>. <span class="strong">取值</span><tt class="literal"><font face="新宋体">on_close</font></tt> | <tt class="literal"><font face="新宋体">after_transaction</font></tt> | <tt class="literal"><font face="新宋体">after_statement</font></tt> | <tt class="literal"><font face="新宋体">auto</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.connection.<span class="emphasis"><em>&lt;propertyName&gt;</em></span></font> </tt></td>
            <td>将JDBC属性<tt class="literal"><font face="新宋体">propertyName</font></tt>传递到<tt class="literal"><font face="新宋体">DriverManager.getConnection()</font></tt>中去. </td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.jndi.<span class="emphasis"><em>&lt;propertyName&gt;</em></span></font> </tt></td>
            <td>将属性<tt class="literal"><font face="新宋体">propertyName</font></tt>传递到JNDI <tt class="literal"><font face="新宋体">InitialContextFactory</font></tt>中去. </td>
        </tr>
    </tbody>
</table>
</div>
<div class="table"><a name="configuration-cache-properties"></a>
<p class="title"><strong>表&nbsp;3.5.&nbsp; Hibernate缓存属性 </strong></p>
<table summary="                Hibernate缓存属性&#13;&#10;    " border="1">
    <colgroup>
    <col>
    <col></colgroup>
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.cache.provider_class</font> </tt></td>
            <td>自定义的<tt class="literal"><font face="新宋体">CacheProvider</font></tt>的类名. <span class="strong">取值</span><tt class="literal"><font face="新宋体">classname.of.CacheProvider</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.cache.use_minimal_puts</font> </tt></td>
            <td>以频繁的读操作为代价, 优化二级缓存来最小化写操作. 在Hibernate3中，这个设置对的集群缓存非常有用, 对集群缓存的实现而言，默认是开启的. <span class="strong">取值</span><tt class="literal"><font face="新宋体">true|false</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.cache.use_query_cache</font> </tt></td>
            <td>允许查询缓存, 个别查询仍然需要被设置为可缓存的. <span class="strong">取值</span><tt class="literal"><font face="新宋体">true|false</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.cache.use_second_level_cache</font> </tt></td>
            <td>能用来完全禁止使用二级缓存. 对那些在类的映射定义中指定<tt class="literal"><font face="新宋体">&lt;cache&gt;</font></tt>的类，会默认开启二级缓存. <span class="strong">取值</span><tt class="literal"><font face="新宋体">true|false</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.cache.query_cache_factory</font> </tt></td>
            <td>自定义实现<tt class="literal"><font face="新宋体">QueryCache</font></tt>接口的类名, 默认为内建的<tt class="literal"><font face="新宋体">StandardQueryCache</font></tt>. <span class="strong">取值</span><tt class="literal"><font face="新宋体">classname.of.QueryCache</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.cache.region_prefix</font> </tt></td>
            <td>二级缓存区域名的前缀. <span class="strong">取值</span><tt class="literal"><font face="新宋体">prefix</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.cache.use_structured_entries</font> </tt></td>
            <td>强制Hibernate以更人性化的格式将数据存入二级缓存. <span class="strong">取值</span><tt class="literal"><font face="新宋体">true|false</font></tt></td>
        </tr>
    </tbody>
</table>
</div>
<div class="table"><a name="configuration-transaction-properties"></a>
<p class="title"><strong>表&nbsp;3.6.&nbsp; Hibernate事务属性 </strong></p>
<table summary="                Hibernate事务属性&#13;&#10;    " border="1">
    <colgroup>
    <col>
    <col></colgroup>
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.transaction.factory_class</font> </tt></td>
            <td>一个<tt class="literal"><font face="新宋体">TransactionFactory</font></tt>的类名, 用于Hibernate <tt class="literal"><font face="新宋体">Transaction</font></tt> API (默认为<tt class="literal"><font face="新宋体">JDBCTransactionFactory</font></tt>). <span class="strong">取值</span><tt class="literal"><font face="新宋体">classname.of.TransactionFactory</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">jta.UserTransaction</font> </tt></td>
            <td>一个JNDI名字，被<tt class="literal"><font face="新宋体">JTATransactionFactory</font></tt>用来从应用服务器获取JTA <tt class="literal"><font face="新宋体">UserTransaction</font></tt>. <span class="strong">取值</span><tt class="literal"><font face="新宋体">jndi/composite/name</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.transaction.manager_lookup_class</font> </tt></td>
            <td>一个<tt class="literal"><font face="新宋体">TransactionManagerLookup</font></tt>的类名 - 当使用JVM级缓存，或在JTA环境中使用hilo生成器的时候需要该类. <span class="strong">取值</span><tt class="literal"><font face="新宋体">classname.of.TransactionManagerLookup</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.transaction.flush_before_completion</font> </tt></td>
            <td>如果开启, session在事务完成后将被自动清洗(flush)。 现在更好的方法是使用自动session上下文管理。<span class="strong">取值</span><tt class="literal"><font face="新宋体">true</font></tt> | <tt class="literal"><font face="新宋体">false</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.transaction.auto_close_session</font> </tt></td>
            <td>如果开启, session在事务完成后将被自动关闭。 现在更好的方法是使用自动session上下文管理。<span class="strong">取值</span><tt class="literal"><font face="新宋体">true</font></tt> | <tt class="literal"><font face="新宋体">false</font></tt></td>
        </tr>
    </tbody>
</table>
</div>
<div class="table"><a name="configuration-misc-properties"></a>
<p class="title"><strong>表&nbsp;3.7.&nbsp; 其他属性 </strong></p>
<table summary="                其他属性&#13;&#10;    " border="1">
    <colgroup>
    <col>
    <col></colgroup>
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.current_session_context_class</font> </tt></td>
            <td>为"当前" <tt class="literal"><font face="新宋体">Session</font></tt>指定一个(自定义的)策略。<span class="strong">eg.</span><tt class="literal"><font face="新宋体">jta</font></tt> | <tt class="literal"><font face="新宋体">thread</font></tt> | <tt class="literal"><font face="新宋体">custom.Class</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.query.factory_class</font> </tt></td>
            <td>选择HQL解析器的实现. <span class="strong">取值</span><tt class="literal"><font face="新宋体">org.hibernate.hql.ast.ASTQueryTranslatorFactory</font></tt> or <tt class="literal"><font face="新宋体">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.query.substitutions</font> </tt></td>
            <td>将Hibernate查询中的符号映射到SQL查询中的符号 (符号可能是函数名或常量名字). <span class="strong">取值</span><tt class="literal"><font face="新宋体">hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.hbm2ddl.auto</font> </tt></td>
            <td>在<tt class="literal"><font face="新宋体">SessionFactory</font></tt>创建时，自动检查数据库结构，或者将数据库schema的DDL导出到数据库. 使用 <tt class="literal"><font face="新宋体">create-drop</font></tt>时,在显式关闭<tt class="literal"><font face="新宋体">SessionFactory</font></tt>时，将drop掉数据库schema. <span class="strong">取值</span><tt class="literal"><font face="新宋体">validate</font></tt> | <tt class="literal"><font face="新宋体">update</font></tt> | <tt class="literal"><font face="新宋体">create</font></tt> | <tt class="literal"><font face="新宋体">create-drop</font></tt></td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">hibernate.cglib.use_reflection_optimizer</font> </tt></td>
            <td>开启CGLIB来替代运行时反射机制(系统级属性). 反射机制有时在除错时比较有用. 注意即使关闭这个优化, Hibernate还是需要CGLIB. 你不能在<tt class="literal"><font face="新宋体">hibernate.cfg.xml</font></tt>中设置此属性. <span class="strong">取值</span><tt class="literal"><font face="新宋体">true</font></tt> | <tt class="literal"><font face="新宋体">false</font></tt></td>
        </tr>
    </tbody>
</table>
</div>
<div class="sect2" lang="zh-cn">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="configuration-optional-dialects"></a>3.4.1.&nbsp; SQL方言 </h3>
</div>
</div>
</div>
<p>你应当总是为你的数据库将<tt class="literal"><font face="新宋体">hibernate.dialect</font></tt>属性设置成正确的 <tt class="literal"><font face="新宋体">org.hibernate.dialect.Dialect</font></tt>子类. 如果你指定一种方言, Hibernate将为上面列出的一些属性使用合理的默认值, 为你省去了手工指定它们的功夫. </p>
<div class="table"><a name="sql-dialects"></a>
<p class="title"><strong>表&nbsp;3.8.&nbsp; Hibernate SQL方言 (<tt class="literal"><font face="新宋体">hibernate.dialect</font></tt>) </strong></p>
<table summary="                    Hibernate SQL方言 (hibernate.dialect)&#13;&#10;    " border="1">
    <colgroup>
    <col>
    <col></colgroup>
    <thead>
        <tr>
            <th>RDBMS</th>
            <th>方言 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>DB2</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.DB2Dialect</font> </tt></td>
        </tr>
        <tr>
            <td>DB2 AS/400</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.DB2400Dialect</font> </tt></td>
        </tr>
        <tr>
            <td>DB2 OS390</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.DB2390Dialect</font> </tt></td>
        </tr>
        <tr>
            <td>PostgreSQL</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.PostgreSQLDialect</font> </tt></td>
        </tr>
        <tr>
            <td>MySQL</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.MySQLDialect</font> </tt></td>
        </tr>
        <tr>
            <td>MySQL with InnoDB</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.MySQLInnoDBDialect</font> </tt></td>
        </tr>
        <tr>
            <td>MySQL with MyISAM</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.MySQLMyISAMDialect</font> </tt></td>
        </tr>
        <tr>
            <td>Oracle (any version)</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.OracleDialect</font> </tt></td>
        </tr>
        <tr>
            <td>Oracle 9i/10g</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.Oracle9Dialect</font> </tt></td>
        </tr>
        <tr>
            <td>Sybase</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.SybaseDialect</font> </tt></td>
        </tr>
        <tr>
            <td>Sybase Anywhere</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.SybaseAnywhereDialect</font> </tt></td>
        </tr>
        <tr>
            <td>Microsoft SQL Server</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.SQLServerDialect</font> </tt></td>
        </tr>
        <tr>
            <td>SAP DB</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.SAPDBDialect</font> </tt></td>
        </tr>
        <tr>
            <td>Informix</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.InformixDialect</font> </tt></td>
        </tr>
        <tr>
            <td>HypersonicSQL</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.HSQLDialect</font> </tt></td>
        </tr>
        <tr>
            <td>Ingres</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.IngresDialect</font> </tt></td>
        </tr>
        <tr>
            <td>Progress</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.ProgressDialect</font> </tt></td>
        </tr>
        <tr>
            <td>Mckoi SQL</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.MckoiDialect</font> </tt></td>
        </tr>
        <tr>
            <td>Interbase</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.InterbaseDialect</font> </tt></td>
        </tr>
        <tr>
            <td>Pointbase</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.PointbaseDialect</font> </tt></td>
        </tr>
        <tr>
            <td>FrontBase</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.FrontbaseDialect</font> </tt></td>
        </tr>
        <tr>
            <td>Firebird</td>
            <td><tt class="literal"><font face="新宋体">org.hibernate.dialect.FirebirdDialect</font> </tt></td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div>
<p class="title"><strong>表&nbsp;3.9.&nbsp; Hibernate日志类别 </strong></p>
<table summary="                    Hibernate日志类别&#13;&#10;    " border="1">
    <colgroup>
    <col>
    <col></colgroup>
    <thead>
        <tr>
            <th>类别 </th>
            <th>功能 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.SQL</font> </tt></td>
            <td>在所有SQL DML语句被执行时为它们记录日志 </td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.type</font> </tt></td>
            <td>为所有JDBC参数记录日志 </td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.tool.hbm2ddl</font> </tt></td>
            <td>在所有SQL DDL语句执行时为它们记录日志 </td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.pretty</font> </tt></td>
            <td>在session清洗(flush)时，为所有与其关联的实体(最多20个)的状态记录日志 </td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.cache</font> </tt></td>
            <td>为所有二级缓存的活动记录日志 </td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.transaction</font> </tt></td>
            <td>为事务相关的活动记录日志 </td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.jdbc</font> </tt></td>
            <td>为所有JDBC资源的获取记录日志 </td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.hql.AST</font> </tt></td>
            <td>在解析查询的时候,记录HQL和SQL的AST分析日志 </td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.secure</font> </tt></td>
            <td>为JAAS认证请求做日志 </td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate</font> </tt></td>
            <td>为任何Hibernate相关信息做日志 (信息量较大, 但对查错非常有帮助) </td>
        </tr>
    </tbody>
</table>
</div>
<p class="title"><strong>表&nbsp;3.10.&nbsp;JTA TransactionManagers</strong> </p>
<table summary="JTA TransactionManagers" border="1">
    <colgroup>
    <col>
    <col></colgroup>
    <thead>
        <tr>
            <th>Transaction工厂类 </th>
            <th align="center">应用程序服务器 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.transaction.JBossTransactionManagerLookup</font> </tt></td>
            <td align="center">JBoss</td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.transaction.WeblogicTransactionManagerLookup</font> </tt></td>
            <td align="center">Weblogic</td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.transaction.WebSphereTransactionManagerLookup</font> </tt></td>
            <td align="center">WebSphere</td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</font> </tt></td>
            <td align="center">WebSphere 6</td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.transaction.OrionTransactionManagerLookup</font> </tt></td>
            <td align="center">Orion</td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.transaction.ResinTransactionManagerLookup</font> </tt></td>
            <td align="center">Resin</td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.transaction.JOTMTransactionManagerLookup</font> </tt></td>
            <td align="center">JOTM</td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.transaction.JOnASTransactionManagerLookup</font> </tt></td>
            <td align="center">JOnAS</td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.transaction.JRun4TransactionManagerLookup</font> </tt></td>
            <td align="center">JRun4</td>
        </tr>
        <tr>
            <td><tt class="literal"><font face="新宋体">org.hibernate.transaction.BESTransactionManagerLookup</font> </tt></td>
            <td align="center">Borland ES</td>
        </tr>
    </tbody>
</table>
<br />
<img src ="http://www.blogjava.net/microlab4321/aggbug/142256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-09-03 12:36 <a href="http://www.blogjava.net/microlab4321/articles/142256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)浅谈hibernate性能优化的几点建议 </title><link>http://www.blogjava.net/microlab4321/articles/137559.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Fri, 17 Aug 2007 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/137559.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/137559.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/137559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/137559.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/137559.html</trackback:ping><description><![CDATA[1、针对oracle数据库而言，Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数，一般设置为30、50、100。Oracle数据库的JDBC驱动默认的Fetch Size=15，设置Fetch Size设置为：30、50，性能会有明显提升，如果继续增大，超出100，性能提升不明显，反而会消耗内存。<br>&nbsp;&nbsp;&nbsp; 即在hibernate配制文件中进行配制：<br>&nbsp;
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property&nbsp;name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hibernateProperties</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">props</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">prop&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hibernate.dialect</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">org.hibernate.dialect.Oracle9Dialect</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">prop</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">prop&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hibernate.show_sql</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">prop</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;!--</span><span style="COLOR: #000000">&nbsp;Create</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">update&nbsp;the&nbsp;database&nbsp;tables&nbsp;automatically&nbsp;when&nbsp;the&nbsp;JVM&nbsp;starts&nbsp;up<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">prop&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hibernate.hbm2ddl.auto</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">update</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">prop</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">--&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;!--</span><span style="COLOR: #000000">&nbsp;Turn&nbsp;batching&nbsp;off&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;better&nbsp;error&nbsp;messages&nbsp;under&nbsp;PostgreSQL&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">prop&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hibernate.jdbc.batch_size</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">prop</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">--&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">prop&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hibernate.jdbc.batch_size</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">50</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">prop</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">props</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span></div>
Fetch Size设的越大，读数据库的次数越少，速度越快；Fetch Size越小，读数据库的次数越多，速度越慢。<br>2、如果是超大的系统，建议生成htm文件。加快页面提升速度。<br>3、不要把所有的责任推在hibernate上，对代码进行重构，减少对数据库的操作，尽量避免在数据库查询时使用in操作，以及避免递归查询操作，代码质量、系统设计的合理性决定系统性能的高低。<br>4、&nbsp;对大数据量查询时，慎用list()或者iterator()返回查询结果， <br>&nbsp;&nbsp;&nbsp;&nbsp; （1）. 使用List()返回结果时，Hibernate会所有查询结果初始化为持久化对象，结果集较大时，会占用很多的处理时间。 <br>&nbsp;&nbsp;&nbsp;&nbsp; （2）. 而使用iterator()返回结果时，在每次调用iterator.next()返回对象并使用对象时，Hibernate才调用查询将对应的对象初始化，对于大数据量时，每调用一次查询都会花费较多的时间。当结果集较大，但是含有较大量相同的数据，或者结果集不是全部都会使用时，使用iterator()才有优势。<br>5、在一对多、多对一的关系中，使用延迟加载机制，会使不少的对象在使用时方会初始化，这样可使得节省内存空间以及减少数据库的负荷，而且若PO中的集合没有被使用时，就可减少互数据库的交互从而减少处理时间。 <br>6、对含有关联的PO（持久化对象）时，若default-cascade="all"或者 &#8220;save-update&#8221;，新增PO时，请注意对PO中的集合的赋值操作，因为有可能使得多执行一次update操作。&nbsp;<br>7、 对于大数据量新增、修改、删除操作或者是对大数据量的查询，与数据库的交互次数是决定处理时间的最重要因素，减少交互的次数是提升效率的最好途径，所以在开发过程中，请将show_sql设置为true，深入了解Hibernate的处理过程，尝试不同的方式，可以使得效率提升。尽可能对每个页面的显示，对数据库的操作减少到100----150条以内。越少越好。<br>以上是在进行struts+hibernate+spring进行项目开发中，对hibernate性能优化的几点心得。 
<img src ="http://www.blogjava.net/microlab4321/aggbug/137559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-17 15:41 <a href="http://www.blogjava.net/microlab4321/articles/137559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate学习心得--性能优化</title><link>http://www.blogjava.net/microlab4321/articles/137046.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Wed, 15 Aug 2007 13:16:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/137046.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/137046.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/137046.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/137046.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/137046.html</trackback:ping><description><![CDATA[<font size=2>文章出自:http://www.blogjava.net/flyingis/archive/2005/11/15/19809.aspx<br>作者：</font><a href="http://www.blogjava.net/flyingis/"><font color=#000080 size=2>Flyingis</font></a><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; 在使用Hibernate进行查询的时候大家都会用到Hibernate缓存，其中Session缓存即一块内存空间，存放了相互关联的Java对象，这些位于Session缓存中的对象就是持久化对象，Session根据持久化对象的状态变化来同步更新数据库。这个Session缓存是Hibernate的一级缓存。此外，SessionFactory有一个内置缓存和一个外置缓存，即Hibernate的第二级缓存。而Hibernate正是由于这些缓存的存在，才使得其数据库操作效率提高，就是说，在提供了方便易操作的操作数据库数据的方式的同时保证了工作效率，但是不能因此而免去后顾之忧，需要在设计业务逻辑层的时候考虑使用最优的架构，节省有效的系统资源。在查询方面，Hibernate主要从以下几个方面来优化查询性能：<br><br>1.降低访问数据库的频率，减少select语句的数目。实现手段包括：<br><br>&nbsp;&nbsp;&nbsp; 使用迫切左外连接或迫切内连接检索策略。<br>&nbsp;&nbsp;&nbsp; 对延迟检索或立即检索策略设置批量检索数目。<br>&nbsp;&nbsp;&nbsp; 使用查询缓存。<br><br>2.避免多余加载程序不需要访问的数据。实现手段包括：<br><br>&nbsp;&nbsp;&nbsp; 使用延迟检索策略。<br>&nbsp;&nbsp;&nbsp; 使用集合过滤。<br><br>3.避免报表查询数据占用缓存。实现手段为利用投影查询功能，查询出实体的部分属性。<br><br>4.减少select语句中的字段，从而降低访问数据库的数据量。实现手段为利用Query的iterate()方法。<br><br>&nbsp;&nbsp;&nbsp; 在插入和更新数据时，要控制insert和update语句，合理设置映射属性来保证插入更新的性能，例如，当表中包含许多字段时，建议把dynamic-update属性和dynamic-update属性都设为true，这样在insert和update语句中就只包含需要插入或更新的字段，这可以节省数据库执行SQL语句的时间，从而提高应用的运行性能。</font>
<p><font size=2>&nbsp;&nbsp;&nbsp; 还有什么其它的提升性能的方式希望和大家一起讨论。</font></p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/137046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-15 21:16 <a href="http://www.blogjava.net/microlab4321/articles/137046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate实践 </title><link>http://www.blogjava.net/microlab4321/articles/137045.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Wed, 15 Aug 2007 13:14:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/137045.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/137045.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/137045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/137045.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/137045.html</trackback:ping><description><![CDATA[<p>文章出自:http://www.blogjava.net/BlueDavy/archive/2006/03/27/37582.html<span><span><strong><br>一.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>序</strong> </span></p>
<p><span>在实际项目中使用<span>Hibernate</span>有两年多了，在两年多的实践过程中既体验到了<span>Hibernate</span>带来的<span>N</span>多好处，同时也碰到不少的问题，特写此篇文章做个总结，记录自己在<span>Hibernate</span>实践中的一些经验，希望对于新使用<span>Hibernate</span>的朋友能有个帮助，避免走过多的弯路。</span> </p>
<p><span>阅读本文前建议至少拥有<span>Hibernate</span>的一些基本知识，因为本文不会去详细介绍相关的基本知识，最好就是先用<span>Hibernate</span>开发了一个<span>HelloWorld</span>，<span>^_^</span>。</span> </p>
<p><span>根据自己所经历的项目中使用<span>Hibernate</span>所涉及的范围，本文从开发环境、开发、设计、性能、测试以及推荐的相关书籍方面进行讲述，本篇文档不会讲的非常细致，只是根据自己在实践时的经验提出一些建议，关于细致以及具体的部分请参阅《<span>Hibernate Reference</span>》或推荐的相关书籍章节。</span> </p>
<p><span>此文档的<span>PDF</span>版本请到此下载：</span> </p>
<p><span>http://www.blogjava.net/Files/BlueDavy/Hibernate</span> <span>实践<span>.rar</span></span> </p>
<p><span>本文允许转载，但转载时请注明作者以及来源。</span> </p>
<p><span>作者：<span>BlueDavy</span></span> </p>
<p><span>来源：<span>www.blogjava.net/BlueDavy</span></span> </p>
<p><span><span><strong>二.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>开发环境</strong> </span></p>
<p><span>Hibernate</span> <span>开发环境的搭建非常的简单，不过为了提高基于<span>Hibernate</span>开发的效率，通常都需要使用一些辅助工具，如<span>xdoclet</span>、<span>middlegen</span>等。</span> </p>
<p><span>尽管<span>Hibernate</span>已经封装提供了很简单的进行持久的方法，但在实际项目的使用中基本还是要提供一些通用的代码，以便在进行持久的相关操作的时候能够更加的方便。</span> </p>
<p><strong><span><span>2.1. </span></span><span>lib</span> </strong></p>
<p><span><span><strong>2.1.1.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>Hibernate lib</strong> </span></p>
<p><span>Hibernate</span> <span>相关的</span> <span>lib</span> <span>自然是开发环境中首要的问题，这部分可以从</span> <span>Hibernate</span> <span>的官方网站进行下载，在其官方网站中同时提供了对于</span> <span>Hibernate</span> <span>所必须依赖的</span> <span>lib</span> <span>以及其他可选</span> <span>lib</span> <span>的介绍。</span> </p>
<p><strong><span><span>2.2. </span></span><span>xdoclet</span> </strong></p>
<p><span>Hibernate</span> <span>作为<span>ORM</span>工具，从名字上就能看出它需要一个从<span>O</span></span> <span><span>&#224;</span> </span><span>R</span> <span>的<span>Mapping</span>的描述，而这个描述就是在使用<span>Hibernate</span>时常见的<span>hbm.xml</span>，在没有工具支持的情况下，需要在编写持久层对象的同时手写这个文件，甚为不便。</span> </p>
<p><span>在<span>jdk 5.0</span>未推出之前，<span>xdoclet</span>支持的在<span>javadoc</span>中编写注释生成相关配置文件的方式大受欢迎，减少了编写<span>hibernate</span>映射文件的复杂性，手写一个完整的<span>hibernate</span>映射文件出错几率比较的高，再加上手写容易造成编写出来的风格相差很大，因此，基于<span>xdoclet</span>来生成<span>hbm.xml</span>的方式被大量的采用，基于<span>xdoclet</span>来编写能够基于我们在持久层对象上编写的<span>javadoc</span>来生成<span>hbm.xml</span>文件，非常的方便。</span> </p>
<p><span><span><strong>2.2.1.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>Hibernate template</strong> </span></p>
<p><span>如果没记错的话，大概在</span> <span>04</span> <span>年的时候</span> <span>javaeye</span> <span>上有位同仁整理了一个这样的</span> <span>template</span> <span>文件，</span> <span>^_^</span> <span>，非常感谢，我一直都在用着，呵呵。</span> </p>
<p><span>这个文件的方便就是把它导入</span> <span>eclipse</span> <span>后，在</span> <span>javadoc</span> <span>中我们可以直接写</span> <span>hibid</span> <span>，然后按</span> <span>eclipse</span> <span>的代码辅助键</span> <span>(alt+/)</span> <span>来生成整个</span> <span>hibernate.id</span> <span>的相关的格式，呵呵，免得在写</span> <span>hibernate.id</span> <span>这些东西的时候过于麻烦，</span> <span>^_^</span> <span>，这个</span> <span>template</span> <span>文件我稍微做了修改，可在这里下载：</span> </p>
<p><span>http://www.blogjava.net/Files/BlueDavy/templates-eclipse-tags.rar</span> </p>
<p><span>当然，你也可以选择直接用</span> <span>xdoclet</span> <span>提供的</span> <span>template</span> <span>文件，不过</span> <span>xdoclet</span> <span>官方网站上好像只提供了可直接导入</span> <span>idea</span> <span>的模板文件。</span> </p>
<p><span>关于注释上的</span> <span>hibernate.id</span> <span>这些东西具体请参见</span> <span>xdoclet</span> <span>官方网站的说明。</span> </p>
<p><span>如果你的项目采用的是</span> <span>jdk 5</span> <span>，那么就可以直接使用</span> <span>hibernate annotation</span> <span>了，那就更为方便。</span> </p>
<p><span><span><strong>2.2.2.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>Ant task build</strong> </span></p>
<p><span>Eclipse</span> <span>里没有集成</span> <span>xdoclet</span> <span>的插件，你也可以去安装一个</span> <span>jboss ide</span> <span>的插件，里面有</span> <span>xdoclet</span> <span>的插件，反正我是觉得太麻烦了。</span> </p>
<p><span>在项目中我仍然采用</span> <span>ant task</span> <span>的方式来生成</span> <span>hbm.xml</span> <span>，</span> <span>target</span> <span>如下所示：</span> </p>
<p><span>&lt;path id="app.classpath"&gt;</span> </p>
<p><span>&lt;pathelement path="${java.class.path}"/&gt;</span> </p>
<p><span>&lt;fileset dir="${xdoclib.dir}"&gt;</span> </p>
<p><span>&lt;include name="*.jar"/&gt;</span> </p>
<p><span>&lt;/fileset&gt;</span> </p>
<p><span>&lt;/path&gt;</span> </p>
<p><span>&lt;target name="hbm" description="</span> <span>生成映射文件</span> <span>"&gt; </span></p>
<p><span>&lt;tstamp&gt;</span> </p>
<p><span>&lt;format property="TODAY" pattern="yy-MM-dd"/&gt;</span> </p>
<p><span>&lt;/tstamp&gt;</span> </p>
<p><span>&lt;taskdef name="hibernatedoclet" classname="xdoclet.modules.hibernate.HibernateDocletTask" classpathref="app.classpath"/&gt; </span></p>
<p><span>&lt;hibernatedoclet destdir="src/java" force="true" verbose="true" excludedtags="@version,@author,@todo"&gt; </span></p>
<p><span>&lt;fileset dir="src/java"&gt; &nbsp;</span> </p>
<p><span>&lt;include name="**/po/**/*.java"/&gt; </span></p>
<p><span>&lt;/fileset&gt; </span></p>
<p><span>&lt;hibernate version ="3.0"/&gt; </span></p>
<p><span>&lt;/hibernatedoclet&gt;</span> </p>
<p><span>&lt;/target&gt;</span> </p>
<p><span>这个文件请根据项目情况以及环境稍做修改，</span> <span>^_^</span> <span>，其中需要通过</span> <span>properties</span> <span>文件指明</span> <span>xdocletlib.dir</span> <span>，类似</span> <span>xdocletlib.dir=c:\xdocletlib</span> <span>，里面放置</span> <span>xdoclet</span> <span>的相关</span> <span>jar</span> <span>文件。</span> </p>
<p><span>在搭建好了这样的环境后，就可以在直接在</span> <span>eclipse</span> <span>中运行</span> <span>ant</span> <span>文件中的这个</span> <span>target</span> <span>来生成</span> <span>hbm.xml</span> <span>。</span> </p>
<p><strong><span><span>2.3. </span></span><span>Hibernate3 Tools</span> </strong></p>
<p><span>如果采用<span>Hibernate 3</span>，则可以直接下载<span>Hibernate 3 Tools</span>的<span>Eclipse Plugin</span>，那就可以类似在<span>PL/SQL</span>里执行<span>sql</span>一样在<span>eclipse</span>里执行<span>hql</span>，<span>^_^</span></span> </p>
<p><strong><span><span>2.4. </span></span><span>HibernateUtil</span> </strong></p>
<p><span>为了方便项目中<span>Hibernate</span>的使用，一般来说都会提供<span>HibernateUtil</span>这样的类，这个类的作用主要是创建<span>sessionFactory</span>和管理<span>session</span>，在<span>Hibernate 3</span>以前采用的是在这里建立<span>ThreadLocal</span>来存放<span>session</span>，在<span>Hibernate 3</span>以后则可以直接使用<span>SessionFactory.getCurrentSession</span>来获取<span>session</span>，而<span>session</span>的获取方式则可通过在<span>hibernate.cfg.xml</span>中执行<span>current_session_context_class</span>的属性来决定是采用<span>thread</span>或<span>jta</span>或自定义的方式来产生<span>session</span>。</span> </p>
<p><strong><span><span>2.5. </span></span><span>CommonDao</span> </strong></p>
<p><span>在持久层部分目前采用的较多的仍然是<span>dao</span>模式，<span>Hibernate</span>作为<span>ORM</span>工具已经提供了<span>CRUD</span>的封装，类如可以使用<span>session.save()</span>；<span>session.persist()</span>这样简单的方式来完成<span>CRUD</span>的操作，但在实际的项目中还是需要提供一个通用的<span>Dao</span>，来简化对于事务、异常处理以及<span>session</span>的操作，同时提供一些项目中需要的相关操作。</span> </p>
<p><span><span><strong>三.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>开发</strong> </span></p>
<p><span>在完成了<span>Hibernate</span>的开发环境的搭建后，就可以基于<span>Hibernate</span>进行持久层的开发了，对于持久层开发来说，会涉及到实体的编写、实体的维护以及实体的查询三个部分。</span> </p>
<p><strong><span><span>3.1. </span></span><span>实体的编写</span> </strong></p>
<p><span>Hibernate</span> <span>的一个明显的优点就是在于可透明化的对对象进行持久，这也就意味着持久对象根本就不需要依赖任何的东西，可以采用<span>POJO</span>的方式来编写，在<span>Hibernate 3</span>以上版本还提供了对于<span>Map</span>、<span>XML</span>的方式的持久的支持，就更方便了，在项目中，更多采用的仍然是<span>POJO</span>的方式。</span> </p>
<p><span>在实体的编写上应该说不会有什么问题，只要仔细查看<span>xdoclet</span>关于<span>hibernatedoclet</span>部分的说明即可完成。</span> </p>
<p><span>这块需要学习的主要是普通的值类型注释的编写、<span>id</span>字段注释的编写、关联注释的编写，这些部分<span>xdoclet</span>均提供了较详细的说明。</span> </p>
<p><strong><span><span>3.2. </span></span><span>实体的维护</span> </strong></p>
<p><span><span><strong>3.2.1.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>新增</span> <span>/</span> <span>编辑</span> <span>/</span> <span>删除</span> </strong></p>
<p><span>新增</span> <span>/</span> <span>编辑</span> <span>/</span> <span>删除是持久操作中最常使用的维护性操作，基于</span> <span>Hibernate</span> <span>做这样的维护就比采用</span> <span>sql</span> <span>的方式简单多了，通过上面</span> <span>CommonDao</span> <span>，就可以直接完成</span> <span>dao.save</span> <span>、</span> <span>dao.update</span> <span>、</span> <span>dao.delete</span> <span>的操作，而且在</span> <span>Hibernate 3</span> <span>也支持了批量的</span> <span>insert</span> <span>、</span> <span>update</span> <span>和</span> <span>delete</span> <span>。</span> </p>
<p><span>这个部分中需要注意的是</span> <span>Hibernate</span> <span>对于对象的三种状态的定义：</span> </p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Transient</span> </p>
<p><span>很容易理解，就是从未与</span> <span>session</span> <span>发生过关系的对象，</span> <span>^_^</span> <span>，例如在代码中直接</span> <span>User user=new User()</span> <span>；这样形成的</span> <span>user</span> <span>对象，就称为</span> <span>Transient</span> <span>对象了。</span> </p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Detached</span> </p>
<p><span>同样很容易理解，就是与</span> <span>session</span> <span>发生过关系的对象，但</span> <span>session</span> <span>已经关闭了的情况下存在的对象，例如：</span> </p>
<p><span>User user=new User();</span> </p>
<p><span>user.setName(&#8220;bluedavy&#8221;);</span> </p>
<p><span>session.save(user);</span> </p>
<p><span>session.close();</span> </p>
<p><span>在</span> <span>session.close()</span> <span>后这个时候的</span> <span>user</span> <span>对象就处于</span> <span>Detached</span> <span>状态之中了，如果想将这个对象变为</span> <span>Persistent</span> <span>状态，可以通过</span> <span>session.merge</span> <span>或</span> <span>session.saveOrUpdate()</span> <span>等方式来实现。</span> </p>
<p><span>Detached</span> <span>状态的对象在实际的应用中最常采用，从概念上我们可以这么理解，处于</span> <span>Detached</span> <span>状态的对象可以看做是一个</span> <span>DTO</span> <span>，而不是</span> <span>PO</span> <span>，这从很大程度上就方便了</span> <span>PO</span> <span>在实际项目中的使用了。</span> </p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Persistent</span> </p>
<p><span>Persistent</span> <span>状态就是指和</span> <span>Session</span> <span>发生了关系的对象，并且此时</span> <span>session</span> <span>未关闭，举例如下：</span> </p>
<p><span>User user=new User();</span> </p>
<p><span>user.setName(&#8220;bluedavy&#8221;);</span> </p>
<p><span>session.save(user);</span> </p>
<p><span>user.getName();</span> </p>
<p><span>在</span> <span>session.save</span> <span>后</span> <span>user</span> <span>就处于</span> <span>Persistent</span> <span>状态，此时如果通过</span> <span>session</span> <span>根据</span> <span>user</span> <span>的</span> <span>id</span> <span>去获取</span> <span>user</span> <span>对象，则可发现获取的对象和之前的</span> <span>user</span> <span>是同一个对象，这是</span> <span>session</span> <span>一级缓存所起的作用了，当然，也可以强制的刷新</span> <span>session</span> <span>的一级缓存，让</span> <span>session</span> <span>从数据库中重新获取，只需要在获取前执行</span> <span>session.evict(user)</span> <span>或</span> <span>session.clear()</span> <span>。</span> </p>
<p><span><span><strong>3.2.2.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>关联维护</span> </strong></p>
<p><span>关联维护在</span> <span>Hibernate</span> <span>中表现出来可能会让熟悉使用</span> <span>sql</span> <span>的人有些的不熟，但其实以对象的观点去看是会觉得很正常的。</span> </p>
<p><span>在</span> <span>Hibernate</span> <span>的关联维护中，最重要的是</span> <span>inverse</span> <span>和</span> <span>cascade</span> <span>两个概念。</span> </p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>inverse</span> </p>
<p><span>inverse</span> <span>从词义上看过去可能不是那么容易理解，其实它的意思就是由谁来控制关联关系的自动维护，当</span> <span>inverse=true</span> <span>就意味着当前对象是不能自动维护关联关系，当</span> <span>inverse=false</span> <span>就意味着当前对象可自动维护关联关系，还是举例来说：</span> </p>
<p><span>假设</span> <span>Org</span> <span>和</span> <span>User</span> <span>一对多关联，</span> </p>
<p><span>当</span> <span>org</span> <span>中</span> <span>getUsers</span> <span>的</span> <span>inverse=false</span> <span>的情况：</span> </p>
<p><span>org.getUsers().add(user);</span> </p>
<p><span>dao.save(org);</span> </p>
<p><span>这样执行后将会看到数据库中</span> <span>user</span> <span>这条记录中的</span> <span>orgId</span> <span>已经被设置上去了。</span> </p>
<p><span>当</span> <span>inverse=true</span> <span>的情况下，执行上面的代码，会发现在数据库中</span> <span>user</span> <span>这条记录中的</span> <span>orgId</span> <span>没有被设置上去。</span> </p>
<p><span>^_^</span> <span>，</span> <span>inverse</span> <span>的作用这样可能看的不是很明显，在下面的一对多中会加以描述。</span> </p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>cascade</span> </p>
<p><span>cascade</span> <span>的概念和数据库的</span> <span>cascade</span> <span>概念是基本一致的，</span> <span>cascade</span> <span>的意思形象的来说就是当当前对象执行某操作的情况下，其关联的对象也执行</span> <span>cascade</span> <span>设置的同样的操作。</span> </p>
<p><span>例如当</span> <span>org.getUsers</span> <span>的</span> <span>cascade</span> <span>设置为</span> <span>delete</span> <span>时，当删除</span> <span>org</span> <span>时，相应的</span> <span>users</span> <span>也同样被删除了，但这个时候要注意，</span> <span>org.getUsers</span> <span>这个集合是被删除的</span> <span>user</span> <span>的集合，也就是说如果这个时候数据库中新增加了一个</span> <span>user</span> <span>给</span> <span>org</span> <span>，那么这个</span> <span>user</span> <span>是不会被删除的。</span> </p>
<p><span>cascade</span> <span>的属性值详细见《</span> <span>Hibernate reference</span> <span>》。</span> </p>
<p><span><span><strong>3.2.2.1.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>一对一</strong> </span></p>
<p><span>一对一的关联维护在实际项目中使用不多，一对一在<span>Hibernate</span>中可采用两种方式来构成，一种是主键关联，一种是外键关联。</span> </p>
<p><span>一对一的使用推荐使用主键关联，具体配置方法请参见《<span>Hibernate Reference</span>》。</span> </p>
<p><span><span><strong>3.2.2.2.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>一对多<span>/</span>多对一</strong> </span></p>
<p><span>一对多<span>/</span>多对一的关联维护在实际项目中使用是比较多的，在<span>Hibernate</span>中可采用多种方式来配置一对多的关联，如采用<span>Set</span>、<span>List</span>、<span>Bag</span>、<span>Map</span>等，具体在《<span>Hibernate Reference</span>》中都有详细说明。</span> </p>
<p><span>在这里我想说的一点就是关于<span>inverse</span>的设置，在一对多的情况下建议将一端的<span>inverse</span>设为<span>true</span>，而由多端去自动维护关联关系，为什么这样做其实挺容易理解的，假设<span>org</span>和<span>user</span>为一对多的关联，<span>org.getUsers</span>的<span>inverse</span>设置为<span>false</span>，<span>org.getUsers().add(user);dao.update(org);</span>当<span>update</span>的时候<span>org</span>所关联的所有<span>user</span>的<span>orgId</span>都会更新一次，可想而知这个效率，而如果改为在多端维护<span>(</span>多端设置为<span>inverse=false)</span>，则是这样：<span>user.setOrg(org);dao.update(user);</span>当<span>update</span>的时候就仅仅是更新<span>user</span>这一条记录而已。</span> </p>
<p><span>另外一点就是合理的设置<span>cascade</span>，这个要根据需求来实际决定。</span> </p>
<p><span><span><strong>3.2.2.3.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>多对多</strong> </span></p>
<p><span>多对多的关联维护在实际项目中其实也是比较多的，尽管在《<span>Hibernate Reference</span>》中认为多对多的情况其实很多时候都是设计造成的。</span> </p>
<p><span>多对多的关联也同样可以采用<span>Set</span>、<span>List</span>等多种方式来配置，具体在《<span>Hibernate Reference</span>》中也有详细的说明。</span> </p>
<p><span>多对多的关联维护上没有什么需要多说的，在实践过程中来看这块不会出什么太多问题，唯一需要注意的是合理设置<span>cascade</span>，这个要根据项目的实际情况而定。</span> </p>
<p><strong><span><span>3.3. </span></span><span>实体的查询</span> </strong></p>
<p><span>Hibernate</span> <span>提供了多种方式来支持实体的查询，如对于原有熟悉<span>sql</span>的人可以继续使用<span>sql</span>，符合对象语言的对象查询语句<span>(HQL)</span>以及条件查询<span>API(Criteria)</span>。</span> </p>
<p><span>在熟练使用<span>hql</span>或<span>criteria</span>的情况下，我相信你会觉得<span>Hibernate</span>的查询方式会比采用<span>sql</span>的方式更加简便。</span> </p>
<p><span><span><strong>3.3.1.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>符合对象语言的查询语句</span> </strong></p>
<p><span>Hibernate</span> <span>提供了一种符合对象语言的查询语句，称为</span> <span>HQL</span> <span>，这种语句的好处是能够避免使用</span> <span>sql</span> <span>的情况下依赖数据库特征的情况出现，同时它带来的最大的好处就是我们能够根据</span> <span>OO</span> <span>的习惯去进行实体的查询。</span> </p>
<p><span>对于</span> <span>HQL</span> <span>没有什么多讲的，如果熟悉</span> <span>sql</span> <span>的人应该也是能够很快就学会</span> <span>HQL</span> <span>，而如果不熟悉</span> <span>sql</span> <span>的人那也没关系，</span> <span>HQL</span> <span>的上手是非常容易的，具体请参考《</span> <span>Hibernate Reference</span> <span>》。</span> </p>
<p><span><span><strong>3.3.2.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>占位符式的查询</span> </strong></p>
<p><span>占位符式的查询</span> <span>(</span> <span>就是采用</span> <span>?</span> <span>替换查询语句中的变量</span> <span>)</span> <span>是在采用</span> <span>sql</span> <span>的情况下经常使用的一种查询方式，也是查询时推荐使用的一种方式。</span> </p>
<p><span>Hibernate</span> <span>中的查询参数主要有两种类型：值类型和实体类型，值类型就是指一个切实的值</span> <span>(</span> <span>如</span> <span>String</span> <span>、</span> <span>int</span> <span>、</span> <span>List</span> <span>这些</span> <span>)</span> <span>，实体类型就是一个具体的实体，如编写的</span> <span>User</span> <span>、</span> <span>Organization</span> <span>等，值类型的查询和普通</span> <span>sql</span> <span>几乎一样，而实体类型的查询就体现了</span> <span>Hibernate</span> <span>的强项，</span> <span>^_^</span> <span>，可以起到简化</span> <span>sql</span> <span>的作用，并且使得查询语句更加容易理解。</span> </p>
<p><span><span><strong>3.3.2.1.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>值类型</strong> </span></p>
<p><span><span>3.3.2.1.1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>简单值</span> </p>
<p><span>举例如下：</span> </p>
<p><span>from User u where u.name=:username and u.yearold=:yearold</span> </p>
<p><span>这就是一个常见的简单值的占位符式的查询，通过这样的方式就可以把值注入到参数中：</span> </p>
<p><span>query.setParameter(&#8220;username&#8221;,&#8221;bluedavy&#8221;);</span> </p>
<p><span>query.setParameter(&#8220;yearold&#8221;,25);</span> </p>
<p><span>同样，</span> <span>hibernate</span> <span>也支持和</span> <span>sql</span> <span>完全相同的</span> <span>?</span> <span>的方式，那么上面的语句以及注入参数的方式就变为了：</span> </p>
<p><span>from User u where u.name=? and u.yearold=?</span> </p>
<p><span>query.setParameter(0,&#8221;bluedavy&#8221;);</span> </p>
<p><span>query.setParameter(1,25);</span> </p>
<p><span>推荐使用第一种，那样参数的意义更容易被理解。</span> </p>
<p><span><span>3.3.2.1.2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>in</span> <span>查询</span> </p>
<p><span>in</span> <span>查询也是经常被使用到的一种查询，在</span> <span>Hibernate</span> <span>中表现出来会稍有不同，不过如果按照对象观点去看就很容易理解了，例如下面这句：</span> </p>
<p><span>from User u where u.name in (:usernameList)</span> </p>
<p><span>在</span> <span>Hibernate</span> <span>中通过这样的方式将值注入到这个参数中：</span> </p>
<p><span>List list=new ArrayList();</span> </p>
<p><span>list.add(&#8220;jerry&#8221;);</span> </p>
<p><span>list.add(&#8220;bluedavy&#8221;);</span> </p>
<p><span>query.setParameterList(&#8220;usernameList&#8221;,list);</span> </p>
<p><span>在</span> <span>sql</span> <span>中通常是组装一个由</span> <span>,</span> <span>连接的值来构成</span> <span>in</span> <span>中的参数值，而在</span> <span>Hibernate</span> <span>中则依照对象转化为采用</span> <span>list</span> <span>了，</span> <span>^_^</span> <span>，是不是更方便些。</span> </p>
<p><span><span><strong>3.3.2.2.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>实体类型</strong> </span></p>
<p><span>在<span>Hibernate</span>中关联采用的都是对象形式，表现对外就是隐藏了数据库的外键的部分，这也就对习惯使用<span>sql</span>查询的人带来一个问题，因为无法再操作外键字段，那么在涉及到关联的实体的查询时应该怎么做呢，我把它分为单实体和实体集合两种情况来说说。</span> </p>
<p><span><span>3.3.2.2.1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>单实体</span> </p>
<p><span>单实体的查询对应到</span> <span>sql</span> <span>情况通常是在一对多的情况下通过多端查询同时结合一端的一些过滤条件，在</span> <span>sql</span> <span>中通常采用</span> <span>join</span> <span>的方式来实现这个，而在</span> <span>Hibernate</span> <span>中要实现这点就更容易了，举例如下：</span> </p>
<p><span>User</span> <span>和</span> <span>Organization</span> <span>是一对多，现在要查询属于组织机构名称为</span> <span>&#8221;Blogjava&#8221;</span> <span>以及用户年龄大于</span> <span>20</span> <span>的用户：</span> </p>
<p><span>from User u where u.org.name=:orgname and u.yearold&gt;:yearold</span> </p>
<p><span>query.setParameter(&#8220;orgname&#8221;,&#8221;Blogjava&#8221;);</span> </p>
<p><span>query.setParameter(&#8220;yearold&#8221;,20);</span> </p>
<p><span>可以看到这样的查询语句比</span> <span>sql</span> <span>更简单多了，同时也更容易理解多了。</span> </p>
<p><span><span>3.3.2.2.2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>实体集合</span> </p>
<p><span>实体集合过滤形式的查询在实际的项目中也经常会碰到，仍然用上面的例子，但改为通过</span> <span>Organization</span> <span>去查询：</span> </p>
<p><span>from Organization org where org.name=:orgname and org.users.yearold&gt;:yearold</span> </p>
<p><span>是不是比</span> <span>sql</span> <span>简单多了，而且更容易理解呢，</span> <span>^_^</span> </p>
<p><span>这个时候对象化查询语句的优势就体现出来了，而不用陷入</span> <span>sql</span> <span>的那种关系型的通过外键进行查询的方式。</span> </p>
<p><span><span><strong>3.3.3.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>NamedQuery</strong> </span></p>
<p><span>NamedQuery</span> <span>的意思就是指在</span> <span>PO</span> <span>的映射文件中定义关于</span> <span>PO</span> <span>的查询语句，而在应用中指需要直接调用此查询语句的别名即可，这个好处非常明显，使得所有的查询语句可以统一的进行管理，同样，我们可以在</span> <span>PO</span> <span>中通过</span> <span>javadoc</span> <span>的方式进行定义，这就更方便了，</span> <span>^_^</span> </p>
<p><span>操作</span> <span>NamedQuery</span> <span>的方法和普通</span> <span>hql</span> <span>的方法基本一样：</span> </p>
<p><span>session.getNamedQuery(queryname);</span> </p>
<p><span>其中的</span> <span>queryname</span> <span>就是我们定义的查询语句的别名，一个</span> <span>namedQuery</span> <span>的语句的示例如下：</span> </p>
<p align=left><span>&lt;</span> <span>query </span><span>name</span> <span>=</span> <span>"validate"</span> <span>&gt;&lt;![CDATA[</span> </p>
<p align=left><span>from User u where u.loginname=:loginname and u.password=:password</span> </p>
<p><strong><span>]]&gt;&lt;/</span> <span>query</span> <span>&gt;</span> </strong></p>
<p><span><span><strong>3.3.4.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>Criteria</strong> </span></p>
<p><span>条件查询的</span> <span>API</span> <span>使得我们可以采用完全对象化的方式进行实体的查询，而不是通过</span> <span>hql</span> <span>的方式，在实际项目中，使用</span> <span>hql</span> <span>的方式更为居多，毕竟写起来更方便。</span> </p>
<p><span>关于</span> <span>Criteria</span> <span>的具体介绍请参阅《</span> <span>Hibernate Reference</span> <span>》。</span> </p>
<p><span><span><strong>3.3.5.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>原生</span> <span>SQL</span> </strong></p>
<p><span>原生</span> <span>SQL</span> <span>不推荐使用，但在某些确实需要用</span> <span>sql</span> <span>的情况下那么</span> <span>Hibernate</span> <span>还是支持的，具体见《</span> <span>Hibernate Reference</span> <span>》。</span> </p>
<p><span><span><strong>四.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>设计</strong> </span></p>
<p><span>独立的编写这个章节的原因是希望在采用<span>Hibernate</span>的情况下充分的去发挥<span>Hibernate</span>的优势，改变我们以关系形式去做持久层的设计的惯性思维，形成以<span>OO</span>的思想去设计持久层，所以我非常推荐通过写<span>PO</span>去生成数据表的方式，而不是设计表反向导成<span>PO</span>的形式，当然，对于原有的系统那就没办法了。</span> </p>
<p><span>OO</span> <span>思想中的核心三要素：封装、继承和多态，在<span>Hibernate</span>的支持下同样可以充分发挥<span>OO</span>的三要素来优化持久层的设计。</span> </p>
<p><strong><span><span>4.1. </span></span><span>封装</span> </strong></p>
<p><span><span><strong>4.1.1.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>Component</strong> </span></p>
<p><span>Hibernate</span> <span>中有一个</span> <span>Component</span> <span>的概念，这就允许在进行持久层设计的时候采用细粒度级的领域模型进行设计，例如在</span> <span>User</span> <span>对象中需要记录</span> <span>User</span> <span>的</span> <span>firstname</span> <span>、</span> <span>lastname</span> <span>这些信息，而在其他的表中也有这种需求，那么在</span> <span>Hibernate</span> <span>中我们就可以把</span> <span>firstname</span> <span>、</span> <span>lastname</span> <span>组装为一个</span> <span>UserName</span> <span>对象，作为</span> <span>Component</span> <span>放入</span> <span>User</span> <span>中，在</span> <span>user</span> <span>中就可以变为采用</span> <span>user.getUserName.getFristName</span> <span>的方式来获取。</span> </p>
<p><span>Component</span> <span>对于我们采用对象的封装概念进行持久层设计提供了很好的支持，同时在</span> <span>Hibernate</span> <span>中还有</span> <span>Elements</span> <span>、</span> <span>Properties</span> <span>这些元素，具体请参见《</span> <span>Hibernate Reference</span> <span>》。</span> </p>
<p><strong><span><span>4.2. </span></span><span>继承</span> </strong></p>
<p><span>继承使得我们可以对持久层中的对象进行抽象，类如我们可以形成<span>Person</span>这个对象，而<span>User</span>、<span>Employee</span>都继承自这个对象。</span> </p>
<p><span>继承在数据库形式的设计中固然也可以实现，但通常不能以对象的观点去发挥的淋漓尽致，当然不是说以对象的方式去设计一定是最好的。</span> </p>
<p><span>在<span>Hibernate</span>中对于继承映射到数据表有几种不同的策略，各有适用的不同场合，具体的解释和说明见《<span>Hibernate Reference</span>》</span> </p>
<p><span><span><strong>4.2.1.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>单表策略</span> </strong></p>
<p><span>单表策略很容易理解，就是将类、子类中所有的属性都放至一张表中，这对于子类属性不多的情况非常有效。</span> </p>
<p><span>在</span> <span>Hibernate</span> <span>中通常将子类定义为</span> <span>@hibernate.subclass</span> <span>的方式来实现这个策略。</span> </p>
<p><span><span><strong>4.2.2.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>每个子类一张表</span> </strong></p>
<p><span>每个子类一张表在</span> <span>Hibernate</span> <span>中有几种实现方式，</span> <span>@hibernate.join-subclass</span> <span>、</span> <span>@hibernate.join-subclass-key</span> <span>的组合方式以及</span> <span>@hibernate.join-subclass</span> <span>、</span> <span>@hibernate.discriminator</span> <span>的组合方式是较常用的两种方式，第一种方式采用的是主键关联方式，第二种方式采用的是</span> <span>discriminator</span> <span>字段的关联方式，个人比较推崇第一种方式。</span> </p>
<p><span>这种策略适合在子类属性和父类有较大不同的情况下采用。</span> </p>
<p><span><span><strong>4.2.3.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>每个具体类一张表</span> </strong></p>
<p><span>这种策略适合在类层次结构上有一定数量的抽象类的情况下使用，同样有两种方式，一种是采用显式多态的方式，另一种是采用隐式多态的方式，显式多态采用的为</span> <span>@hibernate.union-subclass</span> <span>的方式，隐式多态则采用每个具体类的</span> <span>PO</span> <span>独立建表的策略，在它的映射文件中将看不出任何的和接口、抽象类的关系，同时对于抽象类，需要指明其</span> <span>abstract=&#8221;true&#8221;</span> <span>。</span> </p>
<p><strong><span><span>4.3. </span></span><span>多态</span> </strong></p>
<p><span><span><strong>4.3.1.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>查询</span> </strong></p>
<p><span>在查询中很容易体现</span> <span>Hibernate</span> <span>对于多态的支持，如系统有</span> <span>Person</span> <span>对象、</span> <span>User</span> <span>和</span> <span>Employee</span> <span>分别继承自</span> <span>Person</span> <span>，同时</span> <span>Person</span> <span>和</span> <span>Organization</span> <span>对象关联，这个时候我们通过</span> <span>Organization</span> <span>获取其关联的</span> <span>Person</span> <span>时得到的既有可能是</span> <span>User</span> <span>，也有可能是</span> <span>Employee</span> <span>，</span> <span>^_^&#8230;</span> </p>
<p><span><span><strong>五.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>性能</strong> </span></p>
<p><span>Hibernate</span> <span>作为<span>ORM</span>工具，从性能上来讲带给了很多人忧虑，但我觉得<span>Hibernate</span>在性能上也许会带来少许的降低，但如果对于不能合理设计数据库和使用<span>SQL</span>的人来说，我觉得<span>Hibernate</span>反倒能提高性能，除非是在一些特殊的场合，如报表式的那种查询推荐继续采用<span>JDBC</span>的方式。</span> </p>
<p><span>Hibernate</span> <span>在性能提升上其实有很多种做法，在《<span>Hibernate Reference</span>》中也有专门的提升性能的章节，在这里我提几点在项目中通常采用的方法。</span> </p>
<p><strong><span><span>5.1. </span></span><span>Lazy Load</span> </strong></p>
<p><span>Lazy Load</span> <span>是常用的一种提升性能的方法，这个其实很容易理解，在不采用<span>lazy load</span>的情况下，<span>Hibernate</span>在获取一个<span>PO</span>的时候，将同时获取<span>PO</span>中的属性、<span>PO</span>中的集合以及集合中对象的属性、集合，这样看过去很容易看出，如果对象的关联结构有深层次的话，最后搞不好整个库都被加载出来了，而在实际使用中往往可能只需要用到<span>PO</span>中的一两个属性而已，这点也是之前的<span>ORM</span>产品经常被批的一点，就是<span>ORM</span>产品不能象<span>sql</span>那样只获取需要的东西，<span>^_^</span>，其实<span>Hibernate</span>在这点上一直就支持，而且支持的还不错，在<span>Hibernate 3</span>以后，默认的<span>lazy</span>就已经设置为<span>true</span>了，这个时候包括<span>po</span>中的属性都是采用<span>lazy load</span>的方式，只有在调用到这个属性时才会从缓存或数据库中加载，当然，集合也同样如此。</span> </p>
<p><span>在<span>lazy load</span>上推荐不要什么字段都采用<span>lazy load</span>的方式，对于一些基本属性的字段建议将其<span>lazy</span>设置为<span>false</span>，而对于一些可能需要消耗内存的字段，如<span>clob</span>这样的字段对象的<span>lazy</span>设置为<span>true</span>，对于集合则全部设置为<span>lazy=true</span>。</span> </p>
<p><span>是否采用<span>Lazy load</span>对系统的性能会有非常明显的影响，同时尽量不要将<span>Detached Object</span>放入<span>Http</span>的<span>session</span>中。</span> </p>
<p><span><span><strong>5.1.1.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>OSIV</strong> </span></p>
<p><span>OSIV</span> <span>：</span> <span>Open Session In View</span> <span>，在</span> <span>B/S</span> <span>系统中通常采用这种方式来更好的去支持</span> <span>Lazy load</span> <span>，意思就是在</span> <span>View</span> <span>加载前打开</span> <span>Session</span> <span>，在</span> <span>View</span> <span>加载完毕后关闭</span> <span>Session</span> <span>的方式，在</span> <span>Spring</span> <span>中有</span> <span>OpenSessionInViewFilter</span> <span>，可参考或直接使用。</span> </p>
<p><strong><span><span>5.2. </span></span><span>Cache</span> </strong></p>
<p><span>Cache</span> <span>是在提升系统性能方面常用的方法，在<span>Hibernate</span>中通常有非常好的对于<span>Cache</span>的支持方法，<span>Hibernate</span>中对于<span>Cache</span>有一级缓存和二级缓存的概念，一级缓存是必须的，位于<span>Session</span>部分，二级缓存则不是必须的，由开发人员自行指定，二级缓存可指定使用何种开源的<span>cache</span>工具，<span>Hibernate 3</span>以后的版本默认使用的是<span>Ehcache</span>，也可以切换为<span>Oscache</span>、<span>JbossCache</span>，对我而言最重要的区别在于对于<span>cluster</span>的支持上。</span> </p>
<p><span>二级缓存能够明显的提高系统的性能，当然，同时也会更加的消耗内存，可以通过配置文件来指定内存中能够加载的最多的元素，这有利于避免消耗过多内存。</span> </p>
<p><span>二级缓存的设置在<span>Hibernate</span>中非常的简单，只需要在相应的<span>hbm.xml</span>中增加<span>cache</span>元素，指明使用何种策略，如<span>read-only</span>、<span>read-write</span>等，也可以直接在<span>hibernate.cfg.xml</span>中增加<span>class-cache</span>的方式来进行全局指定。</span> </p>
<p><strong><span><span>5.3. </span></span><span>高效的查询语句</span> </strong></p>
<p><span>查询语句的是否高效对于系统的性能也是会造成明显的影响的，为了方便系统性能的调优，建议大家对查询语句进行统一管理，如统一采用<span>NamedQuery</span>的方式，在这样的情况下可以在系统运行时请教数据库专家，由他们来分析系统中的查询语句的执行效率以及提出改进策略，而对于开发人员来讲，在查询语句方面最能够注意的就是采用占位符式的查询。</span> </p>
<p><span><span><strong>5.3.1.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>占位符式的查询</span> </strong></p>
<p><span>数据库对于所有的</span> <span>sql</span> <span>语句都要进行语法分析，而其分析通常会受到语句中的大小写、空格以及参数不同的影响，在其语法分析器认为不同的情况下将再次进行分析，这就不可避免的降低了响应的速度，而采用占位符式的查询则可保证语法分析器只进行一次的分析，在参数不同的情况并不会出现重复解析的现象，其次就是要统一查询语句的编写风格，包括大小写、空格这些。</span> </p>
<p><span>我不是很确定</span> <span>Hibernate</span> <span>中对于语句的语法分析，估计和数据库的这种方式应该差不多，不过猜想可能会更智能一些，</span> <span>^_^</span> </p>
<p><strong><span><span>5.4. </span></span><span>一些配置</span> </strong></p>
<p><span>在</span> <span>hibernate.cfg.xml</span> <span>中的一些配置也会对性能产生一定的影响，如</span> <span>jdbc.fetch_size</span> <span>的设置等，还有象采用连接池方面的设置，对于</span> <span>B/S</span> <span>应用的情况建议尽量采用应用服务器提供的</span> <span>JNDI</span> <span>的方式。</span> </p>
<p><strong><span><span>5.5. </span></span><span>建议</span> </strong></p>
<p><span>在性能提升方面从两方面入手，一是持久层对象的设计上，这方面可以参考《</span> <span>Hibernate Reference</span> <span>》中提升性能章节中的一些建议，另一方面则是请教数据库专家，由数据库专家对表结构、查询语句等进行分析来给出改进策略，在现有的一个项目中，竟然有出现</span> <span>Hibernate</span> <span>在外键上没建立索引的现象出现？</span> </p>
<p><span><span><strong>六.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>测试</strong> </span></p>
<p><strong><span><span>6.1. </span></span><span>编写专门的测试用的配置文件</span> </strong></p>
<p><span>测试方面也是极度关心的话题，在测试方面其实比较简单，只需要在测试类中采用专门用于测试的配置文件即可，在这个配置文件中，通过都是采用设置<span>hbm2ddl.auto</span>属性为<span>create-drop</span>的方式，也就是在测试类运行前创建表，在测试类运行后删除表的策略，在更多的情况下，我们可以采用<span>in-memory</span>的数据库的方式，如<span>hsql</span>，当然，有些时候则需要和实际运行环境一致，那么就需要采用建立专门的测试库的方式，避免测试数据和运行数据的相互影响。</span> </p>
<p><span><span><strong>七.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>企业应用开发</strong> </span></p>
<p><span>事务和并发是企业应用开发中非常关注的两个话题，在《<span>Hibernate Reference</span>》中提供了详细的方案，在这里我就简单的说说。</span> </p>
<p><strong><span><span>7.1. </span></span><span>事务</span> </strong></p>
<p><span>事务是企业应用开发中非常重视的一点，而在<span>Hibernate</span>中操作此部分和<span>sql</span>方式没有什么很大的区别，可以通过<span>session</span>主动去获取<span>Transaction</span>来实现事务控制，同时也可以交由应用服务器提供的<span>JTA</span>来实现事务控制。</span> </p>
<p><span>在事务这个级别上如果有更高的要求，建议采用<span>Spring</span>的事务框架。</span> </p>
<p><strong><span><span>7.2. </span></span><span>并发</span> </strong></p>
<p><span>在并发方面多采用锁策略，锁策略和数据库基本相同，同样是乐观锁和悲观锁两种策略，乐观锁策略在<span>Hibernate</span>中推荐使用<span>version</span>或<span>timestamp</span>来实现，具体覆盖方式则需要根据应用而定，如是采用最新的修改的覆盖还是采用版本冲突策略等，悲观锁策略则通过指定对象的锁方式，如<span>LockMode.READ</span>，引用《<span>Hibernate Reference</span>》中的一段话：</span> </p>
<p><span>&#8220;用户其实并不需要花很多精力去担心锁定策略的问题。通常情况下，只要为<span>JDBC</span>连接指定一下隔离级别，然后让数据库去搞定一切就够了。然而，高级用户有时候希望进行一个排它的悲观锁定，或者在一个新的事务启动的时候，重新进行锁定。<span>Hibernate</span>总是使用数据库的锁定机制，从不在内存中锁定对象！</span> </p>
<p><span>如果数据库不支持用户设置的锁定模式，<span>Hibernate</span>将使用适当的替代模式，这一点可以确保应用程序的可移植性。&#8221;。</span> </p>
<p><span>用户可通过几种方式来指定锁定模式：</span> </p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Session.load()</span> <span>的时候指定锁定模式<span>LockMode</span>；</span> </p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Session.lock()</span> <span>；</span> </p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Query.setLockMode()</span> <span>。</span> </p>
<p><span><span><strong>八.</strong> <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><strong>相关书籍</strong> </span></p>
<p><span>Hibernate</span> <span>上手并不难，但要真正的用好它确实不是件容易的事，有些书籍能够很好的帮我们快速的提供解决思路和解决方案，而这些书籍我们也应该常备，以方便自己在有些问题上的解答。</span> </p>
<p><span>同时，我一直坚持的观点，一种开源框架通常带来的不仅仅是开发、使用上的改变，带来的最大的改变仍然是在设计层次上的，设计上能否充分的发挥开源框架的优势才是最为重要的。</span> </p>
<p><strong><span><span>8.1. </span></span><span>《<span>Hibernate Reference</span>》</span> </strong></p>
<p><span>这本没什么说的，必读书籍，也许在读的时候很多东西你不会觉得什么，但当碰到一些确定方向的问题时，可以通过此书快速的查找到相应的解决方案，感谢<span>Redsaga</span>组织的翻译工作，使得我们可以有中文版可看。</span> </p>
<p><span>目前版本<span>(Hibernate <st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">3.1.2</st1:chsdate>)</span>的下载地址：</span> </p>
<p><span><a href="http://www.redsaga.com/hibernate-ref/3.1.2/zh-cn/pdf/hibernate_reference.pdf">http://www.redsaga.com/hibernate-ref/3.1.2/zh-cn/pdf/hibernate_reference.pdf</a> </span></p>
<p><strong><span><span>8.2. </span></span><span>《<span>Hibernate in action</span>》</span> </strong></p>
<p><span>In action</span> <span>系列的书籍也没啥多说的，强烈推荐看看，尽管现在看起来版本有些老了，但里面很多的实践思想仍然是非常值得学习的，网上应该有很多电子版下载的地方。</span> </p>
<p><strong><span><span>8.3. </span></span><span>《深入浅出<span>Hibernate</span>》</span> </strong></p>
<p><span>这本书想必大家也听闻了不少，简称白皮书，<span>^_^</span>，是夏昕、曹晓刚以及唐勇三位大师的大作。</span></p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/137045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-15 21:14 <a href="http://www.blogjava.net/microlab4321/articles/137045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernat配置文件中set元素中各属性的定义 </title><link>http://www.blogjava.net/microlab4321/articles/136427.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136427.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136427.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136427.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136427.html</trackback:ping><description><![CDATA[&lt;set&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="propertyName"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table="table_name"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; schema="schema_name"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lazy="true|false"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (4)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inverse="true|false"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (5)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cascade="all|none|save-update|delete|all-delete-orphan"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (6)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sort="unsorted|natural|comparatorClass"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (7)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; order-by="column_name&nbsp;&nbsp; asc|desc"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (8)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where="arbitrary&nbsp;&nbsp; sql&nbsp;&nbsp; where&nbsp;&nbsp; condition"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (9)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outer-join="true|false|auto"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (10)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; batch-size="N"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (11)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; access="field|property|ClassName"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (12)&nbsp;&nbsp; <br>&nbsp; &gt;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key&nbsp;&nbsp; ....&nbsp;&nbsp; /&gt;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;index&nbsp;&nbsp; ....&nbsp;&nbsp; /&gt;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;element&nbsp;&nbsp; ....&nbsp;&nbsp; /&gt;&nbsp;&nbsp; <br>&nbsp; &lt;/set&gt;&nbsp;&nbsp; <br>&nbsp; (1)&nbsp;&nbsp; name&nbsp;&nbsp; 集合属性的名称&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; (2)&nbsp;&nbsp; table&nbsp;&nbsp; （可选——默认为属性的名称）这个集合表的名称(不能在一对多的关联关系中使用)&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; (3)&nbsp;&nbsp; schema&nbsp;&nbsp; (可选)&nbsp;&nbsp; 表的schema的名称,&nbsp;&nbsp; 他将覆盖在根元素中定义的schema&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; (4)&nbsp;&nbsp; lazy&nbsp;&nbsp; (可选——默认为false)&nbsp;&nbsp; lazy(可选--默认为false)&nbsp;&nbsp; 允许延迟加载（lazy&nbsp;&nbsp; initialization&nbsp;&nbsp; ）(不能在数组中使用)&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; (5)&nbsp;&nbsp; inverse&nbsp;&nbsp; (可选——默认为false)&nbsp;&nbsp; 标记这个集合作为双向关联关系中的方向一端。&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; (6)&nbsp;&nbsp; cascade&nbsp;&nbsp; (可选——默认为none)&nbsp;&nbsp; 让操作级联到子实体&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; (7)&nbsp;&nbsp; sort(可选)指定集合的排序顺序,&nbsp;&nbsp; 其可以为自然的(natural)或者给定一个用来比较的类。&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; (8)&nbsp;&nbsp; order-by&nbsp;&nbsp; (可选,&nbsp;&nbsp; 仅用于jdk1.4)&nbsp;&nbsp; 指定表的字段(一个或几个)再加上asc或者desc(可选),&nbsp;&nbsp; 定义Map,Set和Bag的迭代顺序&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; (9)&nbsp;&nbsp; where&nbsp;&nbsp; (可选)&nbsp;&nbsp; 指定任意的SQL&nbsp;&nbsp; where条件,&nbsp;&nbsp; 该条件将在重新载入或者删除这个集合时使用(当集合中的数据仅仅是所有可用数据的一个子集时这个条件非常有用)&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; (10)&nbsp;&nbsp; outer-join(可选)指定这个集合,只要可能,应该通过外连接(outer&nbsp;&nbsp; join)取得。在每一个SQL语句中,&nbsp;&nbsp; 只能有一个集合可以被通过外连接抓取(译者注:&nbsp;&nbsp; 这里提到的SQL语句是取得集合所属类的数据的Select语句)&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; (11)&nbsp;&nbsp; batch-size&nbsp;&nbsp; (可选,&nbsp;&nbsp; 默认为1)&nbsp;&nbsp; 指定通过延迟加载取得集合实例的批处理块大小（"batch&nbsp;&nbsp; size"）。&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; (12)&nbsp;&nbsp; access(可选-默认为属性property):Hibernate取得属性值时使用的策略 
<img src ="http://www.blogjava.net/microlab4321/aggbug/136427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 16:14 <a href="http://www.blogjava.net/microlab4321/articles/136427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate中对象的3种状态----瞬时态、持久态、脱管态 </title><link>http://www.blogjava.net/microlab4321/articles/136419.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 08:01:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136419.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136419.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136419.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136419.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136419.html</trackback:ping><description><![CDATA[Hibernate的对象有3种状态，分别为：瞬时态(Transient)、&nbsp;持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object)，瞬时对象和脱管对象也称为VO（Value Object）。
<ul>
    <li><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 瞬时态</strong></li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由new命令开辟内存空间的java对象，</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg. Person person = new Person("amigo", "女");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果没有变量对该对象进行引用，它将被java虚拟机回收。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;瞬时对象在内存孤立存在，它是携带信息的载体，不和数据库的数据有任何关联关系，在Hibernate中，可通过session的save()或saveOrUpdate()方法将瞬时对象与数据库相关联，并将数据对应的插入数据库中，此时该瞬时对象转变成持久化对象。</p>
<ul>
    <li><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 持久态</strong></li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 处于该状态的对象在数据库中具有对应的记录，并拥有一个持久化标识。如果是用hibernate的delete()方法，对应的持久对象就变成瞬时对象，因数据库中的对应数据已被删除，该对象不再与数据库的记录关联。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当一个session执行close()或clear()、evict()之后，持久对象变成脱管对象，此时持久对象会变成脱管对象，此时该对象虽然具有数据库识别值，但它已不在HIbernate持久层的管理之下。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 持久对象具有如下特点：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1. 和session实例关联；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 在数据库中有与之关联的记录。</p>
<ul>
    <li><strong>&nbsp;脱管态</strong></li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当与某持久对象关联的session被关闭后，该持久对象转变为脱管对象。当脱管对象被重新关联到session上时，并再次转变成持久对象。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 脱管对象拥有数据库的识别值，可通过update()、saveOrUpdate()等方法，转变成持久对象。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 脱管对象具有如下特点：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.&nbsp; 本质上与瞬时对象相同，在没有任何变量引用它时，JVM会在适当的时候将它回收；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;&nbsp;比瞬时对象多了一个数据库记录标识值。</p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 16:01 <a href="http://www.blogjava.net/microlab4321/articles/136419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的核心接口学习 </title><link>http://www.blogjava.net/microlab4321/articles/136418.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 08:00:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136418.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136418.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136418.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136418.html</trackback:ping><description><![CDATA[&nbsp;本文摘自孙卫琴的《精通Hibernate：Java对象持久化技术详情》<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hibernate有如下5个核心接口：
<ul>
    <li><strong>Configuration接口</strong>：该对象用于配置并且根启动Hibernate。Hibernate应用通过Configuration实例来指定对象-关系映射文件的位置或动态配置Hibernate的属性，然后创建SessionFactory实例。
    <li><strong>SessionFactory接口</strong>：一个SessionFactory实例对应一个数据存储源，应用从SessionFactory中获得Session实例。它具有如下特点：</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）它是线程安全的，这意味着它的同一个实例可以被应用的各个线程共享。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）它是重量级的，这意味着不能随意创建或销毁它的实例。如果应用只访问一个数据库，只需创建一个SessionFactory实例，在应用初始化的时候创建该实例。如果应用同时访问多个数据库，则需要为每个数据库创建一个单独的SessionFactory实例。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;之所以说SessionFactory是重量级的，是因为它需要一个很大的缓存，用来存放预定义的SQL语句以及映射元数据等。用户还可以为SessionFactory配置一个缓存插件，这个缓存插件被称为Hibernate的第二级缓存，该缓存用来存放被工作单元读过的数据，将来其它工作单元可能会重用这些数据，因此这个缓存中的数据能够被所有工作单元共享，一个工作单元通常对应一个数据库事务。</p>
<ul>
    <li><strong>Session接口：</strong>该接口是Hibernate应用使用最广泛的接口。Session也被称为持久化管理器，提供了和持久化相关的操作，如添加、更新、删除、加载和查询对象。Session具有一下特点：</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）不是线程安全的，因此在设计软件架构时，应该避免多个线程共享同一个Session实例；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2）Session实例是轻量级的，所谓轻量级，是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建和销毁Session对象，例如为每个客户请求分配单独的Session实例，或者为每个工作单元分配单独的Session实例。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session有一个缓存，被称为Hibernate的第一级缓存，它存放被当前工作单元加载的对象。每个Session实例都有自己的缓存，这个Session实例的缓存，这个Session实例的缓存只能被当前工作单元访问。</p>
<ul>
    <li>&nbsp;<strong>Transaction：</strong>该接口是Hibernate的数据库事务接口，它对底层的事务接口做了封装，底层事务接口包括：JDBC API、JTA（Java Transaction API）、CORBA（Common Object Requet Broker Architecture) API.</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hibernate应用可通过一致的Transaction接口来声明事务边界，这有助于应用在不同环境或容器中移植。</p>
<ul>
    <li>&nbsp;<strong>Query和Criteria接口：</strong>它们是Hibernate的查询接口，用于向数据库查询对象，以及控制执行查询的过程。Query实例封装了一个HQL（Hibernate Query Language）查询语句，HQL是面向对象的，它引用类名及类的属性名，而不是表名及表的字段名。Criteria接口完全封装了基于字符串形式的查询语句，比Query接口更加面向对象，Criteria接口更擅长于执行动态查询。</li>
</ul>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 16:00 <a href="http://www.blogjava.net/microlab4321/articles/136418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的检索策略小结 </title><link>http://www.blogjava.net/microlab4321/articles/136303.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136303.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136303.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136303.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136303.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136303.html</trackback:ping><description><![CDATA[Hibernate的检索策略包括类级别检索策略和关联级别检索策略。
<p style="MARGIN-BOTTOM: 0cm"><font face="文鼎PL细上海宋Uni, serif"></font>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 类级别检索策略有立即检索和延迟检索，默认的检索策略是立即检索。在<font face="文鼎PL细上海宋Uni, serif">Hibernate</font>映射文件中，通过在<font face="文鼎PL细上海宋Uni, serif">&lt;class&gt;</font>上配置<font face="文鼎PL细上海宋Uni, serif">lazy</font>属性来确定检索策略。对于<font face="文鼎PL细上海宋Uni, serif">Session</font>的检索方式，类级别检索策略仅适用于<font face="文鼎PL细上海宋Uni, serif">load</font>方法；也就说，对于<font face="文鼎PL细上海宋Uni, serif">get</font>、<font face="文鼎PL细上海宋Uni, serif">qurey</font>检索，持久化对象都会被立即加载而不管<font face="文鼎PL细上海宋Uni, serif">lazy</font>是<font face="文鼎PL细上海宋Uni, serif">false</font>还是<font face="文鼎PL细上海宋Uni, serif">true</font>。一般来说，我们检索对象就是要访问它，因此立即检索是通常的选择。由于<font face="文鼎PL细上海宋Uni, serif">load</font>方法在检索不到对象时会抛出异常（立即检索的情况下），因此我个人并不建议使用<font face="文鼎PL细上海宋Uni, serif">load</font>检索；而由于<font face="文鼎PL细上海宋Uni, serif">&lt;class&gt;</font>中的<font face="文鼎PL细上海宋Uni, serif">lazy</font>属性还影响到多对一及一对一的检索策略，因此使用<font face="文鼎PL细上海宋Uni, serif">load</font>方法就更没必要了。</p>
<p style="MARGIN-BOTTOM: 0cm"><font face="文鼎PL细上海宋Uni, serif"></font>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 关联级别检索策略有立即检索、延迟检索和迫切左外连接检索。对于关联级别检索，又可分为一对多和多对多、多对一和一对一两种情况讨论。</p>
<p style="MARGIN-BOTTOM: 0cm"><font face="文鼎PL细上海宋Uni, serif"></font>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 一对多和多对多关联关系一般使用<font face="文鼎PL细上海宋Uni, serif">&lt;set&gt;</font>配置。<font face="文鼎PL细上海宋Uni, serif">&lt;set&gt;</font>有<font face="文鼎PL细上海宋Uni, serif">lazy</font>和<font face="文鼎PL细上海宋Uni, serif">outer-join</font>属性，它们的不同取值绝对了检索策略。</p>
<p style="MARGIN-BOTTOM: 0cm"><font face="文鼎PL细上海宋Uni, serif">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1</font>）立即检索：这是一对多默认的检索策略，此时<font face="文鼎PL细上海宋Uni, serif">lazy=false</font>，<font face="文鼎PL细上海宋Uni, serif">outer-join=false</font>。尽管这是默认的检索策略，但如果关联的集合是无用的，那么就不要使用这种检索方式。</p>
<p style="MARGIN-BOTTOM: 0cm"><font face="文鼎PL细上海宋Uni, serif">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2</font>）延迟检索：此时<font face="文鼎PL细上海宋Uni, serif">lazy=true</font>，<font face="文鼎PL细上海宋Uni, serif">outer-join=false</font>（<font face="文鼎PL细上海宋Uni, serif">outer-join=true</font>是无意义的），这是优先考虑的检索方式。</p>
<p style="MARGIN-BOTTOM: 0cm"><font face="文鼎PL细上海宋Uni, serif">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 3</font>）迫切左外连接检索：此时 <font face="文鼎PL细上海宋Uni, serif">lazy=false</font>，<font face="文鼎PL细上海宋Uni, serif">outer-join=true</font>，这种检索策略只适用于依靠<font face="文鼎PL细上海宋Uni, serif">id</font>检索方式（<font face="文鼎PL细上海宋Uni, serif">load</font>、<font face="文鼎PL细上海宋Uni, serif">get</font>），而不适用于<font face="文鼎PL细上海宋Uni, serif">query</font>的集合检索（它会采用立即检索策略）。相比于立即检索，这种检索策略减少了一条<font face="文鼎PL细上海宋Uni, serif">sql</font>语句，但在<font face="文鼎PL细上海宋Uni, serif">Hibernate</font>中，只能有一个<font face="文鼎PL细上海宋Uni, serif">&lt;set&gt;</font>配置成 <font face="文鼎PL细上海宋Uni, serif">outer-join=true</font>。</p>
<p style="MARGIN-BOTTOM: 0cm"><font face="文鼎PL细上海宋Uni, serif"></font>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 多对一和一对一检索策略一般使用<font face="文鼎PL细上海宋Uni, serif">&lt;many-to-one&gt;</font>、<font face="文鼎PL细上海宋Uni, serif">&lt;one-to-one&gt;</font>配置。<font face="文鼎PL细上海宋Uni, serif">&lt;many-to-one&gt;</font>中需要配置的属性是 <font face="文鼎PL细上海宋Uni, serif">outer-join</font>，同时还需要配置<font face="文鼎PL细上海宋Uni, serif">one</font>端关联的<font face="文鼎PL细上海宋Uni, serif">&lt;class&gt;</font>的<font face="文鼎PL细上海宋Uni, serif">lazy</font>属性（配置的可不是<font face="文鼎PL细上海宋Uni, serif">&lt;many-to-one&gt;</font>中的<font face="文鼎PL细上海宋Uni, serif">lazy</font>哦），它们的组合后的检索策略如下：</p>
<p style="MARGIN-BOTTOM: 0cm"><font face="文鼎PL细上海宋Uni, serif">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1</font>） <font face="文鼎PL细上海宋Uni, serif">outer-join=auto</font>：这是默认值，如果<font face="文鼎PL细上海宋Uni, serif">lazy=true</font>为延迟检索，如果<font face="文鼎PL细上海宋Uni, serif">lazy=false</font>为迫切左外连接检索。</p>
<p style="MARGIN-BOTTOM: 0cm"><font face="文鼎PL细上海宋Uni, serif">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2</font>） <font face="文鼎PL细上海宋Uni, serif">outer-join=true</font>，无关于<font face="文鼎PL细上海宋Uni, serif">lazy</font>，都为迫切左外连接检索。</p>
<p style="MARGIN-BOTTOM: 0cm"><font face="文鼎PL细上海宋Uni, serif">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 3</font>） <font face="文鼎PL细上海宋Uni, serif">outer-join=false</font>，如果<font face="文鼎PL细上海宋Uni, serif">lazy=true</font>为延迟检索，否则为立即检索。</p>
<p style="MARGIN-BOTTOM: 0cm"><font face="文鼎PL细上海宋Uni, serif"></font>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 可以看到，在默认的情况下（<font face="文鼎PL细上海宋Uni, serif">outer-join=auto</font>，<font face="文鼎PL细上海宋Uni, serif">lazy=false</font>），对关联的<font face="文鼎PL细上海宋Uni, serif">one</font>端对象<font face="文鼎PL细上海宋Uni, serif">Hibernate</font>采用的迫切左外连接检索。依我看，很多情况下，我们并不需要加载<font face="文鼎PL细上海宋Uni, serif">one</font>端关联的对象（很可能我们需要的仅仅是关联对象的<font face="文鼎PL细上海宋Uni, serif">id</font>）；另外，如果关联对象也采用了迫切左外连接检索，就会出现<font face="文鼎PL细上海宋Uni, serif">select</font>语句中有多个外连接表，如果个数多的话会影响检索性能，这也是为什么<font face="文鼎PL细上海宋Uni, serif">Hibernate</font>通过<font face="文鼎PL细上海宋Uni, serif">hibernate.max_fetch_depth</font>属性来控制外连接的深度。对于迫切左外连接检索，<font face="文鼎PL细上海宋Uni, serif">query</font>的集合检索并不适用，它会采用立即检索策略。</p>
<p style="MARGIN-BOTTOM: 0cm"><font face="文鼎PL细上海宋Uni, serif"></font>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 对于检索策略，需要根据实际情况进行选择。对于立即检索和延迟检索，它们的优点在于<font face="文鼎PL细上海宋Uni, serif">select</font>语句简单（每张表一条语句）、查询速度快，缺点在于关联表时需要多条<font face="文鼎PL细上海宋Uni, serif">select</font>语句，增加了访问数据库的频率。因此在选择即检索和延迟检索时，可以考虑使用批量检索策略来减少<font face="文鼎PL细上海宋Uni, serif">select</font>语句的数量（配置<font face="文鼎PL细上海宋Uni, serif">batch-size</font>属性）。对于切左外连接检索，优点在于<font face="文鼎PL细上海宋Uni, serif">select</font>较少，但缺点是<font face="文鼎PL细上海宋Uni, serif">select</font>语句的复杂度提高，多表之间的关联会是很耗时的操作。另外，配置文件是死的，但程序是活的，可以根据需要在程序里显示的指定检索策略（可能经常需要在程序中显示指定迫切左外连接检索）。为了清楚检索策略的配置效果如何，可以配置<font face="文鼎PL细上海宋Uni, serif">show_sql</font>属性查看程序运行时<font face="文鼎PL细上海宋Uni, serif">Hibernate</font>执行的<font face="文鼎PL细上海宋Uni, serif">sql</font>语句。</p>
<p style="MARGIN-BOTTOM: 0cm"><font face="文鼎PL细上海宋Uni, serif"></font>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br></p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136303.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 10:22 <a href="http://www.blogjava.net/microlab4321/articles/136303.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>