<?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/i369/category/18312.html</link><description>北极心空</description><language>zh-cn</language><lastBuildDate>Tue, 22 Apr 2008 17:06:24 GMT</lastBuildDate><pubDate>Tue, 22 Apr 2008 17:06:24 GMT</pubDate><ttl>60</ttl><item><title>Hibernate 参数设置一览表</title><link>http://www.blogjava.net/i369/articles/194855.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 22 Apr 2008 10:28:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/194855.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/194855.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/194855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/194855.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/194855.html</trackback:ping><description><![CDATA[<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>
    <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>
    <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>
    <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>
    <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>
    <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>
    <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>
    <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/i369/aggbug/194855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-04-22 18:28 <a href="http://www.blogjava.net/i369/articles/194855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate性能优化</title><link>http://www.blogjava.net/i369/articles/194579.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 21 Apr 2008 10:22:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/194579.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/194579.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/194579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/194579.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/194579.html</trackback:ping><description><![CDATA[有很多人认为Hibernate天生效率比较低，确实，在普遍情况下，需要将执行转换为SQL语句的Hibernate的效率低于直接JDBC存取，然而，在经过比较好的性能优化之后，Hibernate的性能还是让人相当满意的，特别是应用二级缓存之后，甚至可以获得比较不使用缓存的JDBC更好的性能，下面介绍一些通常的Hibernate的优化策略：<br />
&nbsp;&nbsp;&nbsp;&nbsp;1.抓取优化<br />
&nbsp;&nbsp;&nbsp;&nbsp;抓取是指Hibernate如何在关联关系之间进行导航的时候，Hibernate如何获取关联对象的策略，其主要定义了两个方面：如何抓取和何时抓取<br />
&nbsp;&nbsp;&nbsp;&nbsp;1）如何抓取。<br />
&nbsp;&nbsp;&nbsp;&nbsp;Hibernate3主要有两种种抓取方式，分别应用于对象关联实例(many-to-one、one-to-one)和对象关联集合(set、map等)，总共是四种变种<br />
&nbsp;&nbsp;&nbsp;&nbsp;JOIN抓取：&nbsp;通过在SELECT语句中使用OUTER&nbsp;JOIN来获得对象的关联实例或者关联集合）<br />
&nbsp;&nbsp;&nbsp;&nbsp;SELECT抓取：&nbsp;另外发送一条SELECT语句来抓取当前对象的关联实体和集合<br />
&nbsp;&nbsp;&nbsp;&nbsp;在我的开发经历中，此处对性能的优化是比较有限的，并不值得过多关注<br />
&nbsp;&nbsp;&nbsp;&nbsp;例：<br />
&nbsp;&nbsp;&nbsp;&nbsp;A.应用于对象关联实例（默认是false）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;many-to-one&nbsp;name=".."&nbsp;outer-join="true/false/auto"&nbsp;&nbsp;.../&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;B.应用于对象关联集合（默认是auto）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;set&nbsp;name=".."&nbsp;fetch="join/select"&nbsp;...&nbsp;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/set&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;2）何时抓取<br />
&nbsp;&nbsp;&nbsp;&nbsp;主要分为延迟加载和立即抓取，默认的情况下Hibernate3对对象关联实采用延迟加载，普通属性采用立即抓取，通过延迟加载和采用适当的抓取粒度，与不采用优化相比往往可以将性能提升数倍<br />
&nbsp;&nbsp;&nbsp;&nbsp;立即抓取：当抓取宿主对象时，同时抓取其关联对象和关联集以及属性<br />
&nbsp;&nbsp;&nbsp;&nbsp;延迟加载：当抓取宿主对象时，并不抓取其关联对象，而是当对其对象进行调用时才加载<br />
&nbsp;&nbsp;&nbsp;&nbsp;例：<br />
&nbsp;&nbsp;&nbsp;&nbsp;A.应用于对象关联实例（默认是延迟加载）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;many-to-one&nbsp;name=".."&nbsp;&nbsp;lazy="true/false"&nbsp;.../&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;B.应用于对象关联集合（默认是延迟加载）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;set&nbsp;name=".."&nbsp;lazy="true/false"&nbsp;...&nbsp;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/set&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;对于延迟加载，需要注意的时，对延迟对象的使用必须在Session关闭之前进行，Hibernate的LazyInitalizationException往往就是由于在Session的生命期外使用了延迟加载的对象。当我们进行Web开发时，可以使用OpenSessionInView模式，当请求开始时打开session，当请求响应结束时才关闭session，不过，在使用OpenSessionInView模式时，需要注意如果响应时间比较长（业务比较复杂或者客户端是低速网络），将Session资源(也就是数据库的连接)占用太久的话可以会导致资源耗尽<br />
&nbsp;&nbsp;&nbsp;&nbsp;3）抓取粒度<br />
&nbsp;&nbsp;&nbsp;&nbsp;抓取粒度指的是对象在关联关系之间被导航时一次预先加载的数量，Hibernate程序的性能比较差往往就在于没有对抓取粒度仔细考虑，当加载一个列表并在列表中的每个对象中对其关联进行导航时，往往导致N+1条SQL语句查询。<br />
&nbsp;&nbsp;&nbsp;&nbsp;例：<br />
&nbsp;&nbsp;&nbsp;&nbsp;A.应用于对象关联实例（默认为1），注意，对对象关<span class="noted" id="note_879">联实例的设</span>置是在被关联的对象之上的，譬如<br />
&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;User<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Group&nbsp;g;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;那么抓取粒度应该在Group的配置文件之上，见下<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;class&nbsp;name="Group"&nbsp;table="group"&nbsp;batch-size=".."&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;对该值并没有一个约定俗成的值，根据情况而定，如果被关联表数据比较少，则可以设置地小一些，3-20，如果比较大则可以设到30-50，注意的时候，并不是越多越好，当其值超过50之后，对性能并没有多大改善但却无谓地消耗内存<br />
&nbsp;&nbsp;&nbsp;&nbsp;假设有如下例子：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;User&gt;&nbsp;users&nbsp;=&nbsp;query.list();<br />
&nbsp;&nbsp;&nbsp;&nbsp;如果有20个User，并对这20个User及其Group进行遍历，如果不设置batch-size（即batch-size="1"），则在最糟糕的情况<br />
&nbsp;&nbsp;&nbsp;&nbsp;下，需要1&nbsp;+&nbsp;20条SQL语句，如果设置batch-size="10"，则最好的情况下只需要1&nbsp;+&nbsp;2条SQL语句<br />
&nbsp;&nbsp;&nbsp;&nbsp;B.应用于对象关联集合（默认为1）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;set&nbsp;name=".."&nbsp;batch-size=""&nbsp;...&nbsp;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/set&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.二级缓存<br />
&nbsp;&nbsp;&nbsp;&nbsp;Hibernate对数据的缓存包括两个级：一级缓存，在Session的级别上进行，主要是对象缓存，以其id为键保存对象，在Session的生命期间存在；二级缓存，在SessionFactory的级别上进行，有对象缓存和查询缓存，查询缓存以查询条件为键保存查询结果，在SessionFactory的生命期间存在。默认地，Hibernate只启用一级缓存，通过正确地使用二级缓存，往往可以获得意想不到的性能。<br />
&nbsp;&nbsp;&nbsp;&nbsp;1）对象缓存：<br />
&nbsp;&nbsp;&nbsp;&nbsp;当抓取一个对象之后，Hiberate将其以id为键缓存起来，当下次碰到抓取id相同的对象时，可以使用如下配置<br />
&nbsp;&nbsp;&nbsp;&nbsp;方法1：在缓存对象上配置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;class&nbsp;...&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cache&nbsp;useage="read-only/write/...."&nbsp;regions="group"&nbsp;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;useage表示使用什么类型的缓存，譬如只读缓存、读写缓存等等（具体参见Hibernate参考指南），值得注意的时，有部分缓存在Hibernate的实现中不支持读写缓存，譬如JBossCache在Hibernate的实现中只是一种只读缓存，具体缓存实现对缓存类型的支持情况，可以参见org.hibernate.cache包<br />
&nbsp;&nbsp;&nbsp;&nbsp;regions表示缓存分块，大部分的缓存实现往往对缓存进行分块，该部分是可选的，详细参见各缓存实现<br />
&nbsp;&nbsp;&nbsp;&nbsp;方法2：在hibernate.cfg.xml中配置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;cache&nbsp;class=".."&nbsp;useage=".."&nbsp;regions=".."/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;我认为第二种更好，可以统一管理<br />
&nbsp;&nbsp;&nbsp;&nbsp;2)查询缓存<br />
&nbsp;&nbsp;&nbsp;&nbsp;查询时候将查询结果以查询条件为键保存起来，需要配置如下<br />
&nbsp;&nbsp;&nbsp;&nbsp;A.在hibernate.cfg.xml中配置（启用查询缓存）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="hibernate.cache.use_query_cache"&gt;true&lt;/property&gt;&nbsp;&nbsp;（前面的属性名可参见常量<br />
org.hibernate.cfg.Enviroment.USE_QUERY_CACHE）<br />
&nbsp;&nbsp;&nbsp;&nbsp;B.程序<br />
&nbsp;&nbsp;&nbsp;&nbsp;query.setCacheable(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;query.setCacheRegions(...);<br />
&nbsp;&nbsp;&nbsp;&nbsp;需要注意的是,查询缓存与对象缓存要结合更有效,因为查询缓存仅缓存查询结果列表的主键数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;一般情况下在开发中，对一些比较稳定而又被频繁引用的数据，譬如数据字典之类的，将其进行二级缓存，对一些查询条件和查询数据变化不频繁而又常常被使用的查询，将其进行二级缓存。由于二级缓存是放在内存中，而且Hibernate的缓存不是弱引用缓存（WeekReference），所以注意不要将大块的数据放入其中，否则可能会被内存造成比较大的压力。<br />
&nbsp;&nbsp;&nbsp;&nbsp;3.批量数据操作<br />
&nbsp;&nbsp;&nbsp;&nbsp;当进行大批量数据操作（几万甚至几十几百万）时，需要注意两点，一，批量提交，二，及时清除不需要的一级缓存数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;1）所谓的批量提交，就是不要频繁使用session的flush，每一次进行flush，Hibernate将PO数据于数据库进行同步，对于海量级数据操作来说是性能灾难（同时提交几千条数据和提交一条数据flush一次性能差别可能会是几十倍的差异）。一般将数据操作放在事务中，当事务提交时Hibernate自动帮你进行flush操作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;2）及时清除不需要的一级缓存数据：由于Hibernate默认采用一级缓存，而在session的生命期间，所有数据抓取之后会放入一级缓存中，而当数据规模比较庞大时，抓取到内存中的数据会让内存压力非常大，一般分批操作数据，被一次操作之后将一级缓存清除，譬如<br />
&nbsp;&nbsp;&nbsp;&nbsp;session.clear(User.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;4.杂项<br />
&nbsp;&nbsp;&nbsp;&nbsp;dynamic-insert，dynamic-update，动态插入和动态更新，指的是让Hibernate插入数据时仅插入非空数据，当修改数据时只修改变化的数据，譬如对于&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;User<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;如果u.id=1,&nbsp;u.username="ayufox",u.password=null，那么如果不设置动态插入，则其sql语句是insert&nbsp;into&nbsp;users(id,&nbsp;username,&nbsp;password)&nbsp;values&nbsp;(1,&nbsp;'ayufox',&nbsp;')，如果设置则其sql语句是insert&nbsp;into&nbsp;users(username)&nbsp;valeus('ayufox')<br />
&nbsp;&nbsp;&nbsp;&nbsp;在如上的情况下，如果修改u.password='11'，那么如果不设置动态更新，则sql语句为update&nbsp;users&nbsp;set&nbsp;username='ayufox',&nbsp;password='11'&nbsp;where&nbsp;id&nbsp;=&nbsp;1，如果设置则为update&nbsp;user&nbsp;set&nbsp;password='11'&nbsp;where&nbsp;d&nbsp;=&nbsp;1<br />
&nbsp;&nbsp;&nbsp;&nbsp;设置是在class的映射文件中，如下<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;class&nbsp;name="User"&nbsp;table="users"&nbsp;dynamic=insert="true/false"&nbsp;dynamic-update="true/false"&nbsp;...&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/class&gt;<br />
　　该设置对性能的提升比较有限<br />
<!-- google_ad_section_end -->
<img src ="http://www.blogjava.net/i369/aggbug/194579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-04-21 18:22 <a href="http://www.blogjava.net/i369/articles/194579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏] Java数据类型，Hibernate数据类型，标准sql数据类型之间的对应表 </title><link>http://www.blogjava.net/i369/articles/190588.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 03 Apr 2008 04:39:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/190588.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/190588.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/190588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/190588.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/190588.html</trackback:ping><description><![CDATA[<table style="border-right: #f3f3f3 5px solid; border-top: #f3f3f3 5px solid; border-left: #f3f3f3 5px solid; border-bottom: #f3f3f3 5px solid" cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="padding-left: 10px; padding-top: 5px" width="560" colspan="2"><span style="font-size: 13px; line-height: 22px">
            <div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/haoqingshi/articles/10912.html">Java数据类型，Hibernate数据类型，标准sql数据类型之间的对应表</a></div>
            <table style="width: 100%; text-align: left" cellspacing="2" cellpadding="2" border="1">
                <tbody>
                    <tr>
                        <td style="background-color: rgb(204,204,204)"><small><font size="2">Java数据类型</font></small></td>
                        <td style="background-color: rgb(204,204,204)"><small><font size="2">Hibernate数据类型</font></small></td>
                        <td style="background-color: rgb(204,204,204)"><small><font size="2">标准SQL数据类型<br />
                        (PS:对于不同的DB可能有所差异)</font></small></td>
                    </tr>
                    <tr>
                        <td>byte、java.lang.Byte</td>
                        <td>byte</td>
                        <td>TINYINT</td>
                    </tr>
                    <tr>
                        <td>short、java.lang.Short</td>
                        <td>short</td>
                        <td>SMALLINT</td>
                    </tr>
                    <tr>
                        <td>int、java.lang.Integer</td>
                        <td>integer</td>
                        <td>INGEGER</td>
                    </tr>
                    <tr>
                        <td>long、java.lang.Long</td>
                        <td>long</td>
                        <td>BIGINT</td>
                    </tr>
                    <tr>
                        <td>float、java.lang.Float</td>
                        <td>float</td>
                        <td>FLOAT</td>
                    </tr>
                    <tr>
                        <td>double、java.lang.Double</td>
                        <td>double</td>
                        <td>DOUBLE</td>
                    </tr>
                    <tr>
                        <td>java.math.BigDecimal</td>
                        <td>big_decimal</td>
                        <td>NUMERIC</td>
                    </tr>
                    <tr>
                        <td>char、java.lang.Character</td>
                        <td>character</td>
                        <td>CHAR(1)</td>
                    </tr>
                    <tr>
                        <td>boolean、java.lang.Boolean</td>
                        <td>boolean</td>
                        <td>BIT</td>
                    </tr>
                    <tr>
                        <td>java.lang.String</td>
                        <td>string</td>
                        <td>VARCHAR</td>
                    </tr>
                    <tr>
                        <td>boolean、java.lang.Boolean</td>
                        <td>yes_no</td>
                        <td>CHAR(1)('Y'或'N')</td>
                    </tr>
                    <tr>
                        <td>boolean、java.lang.Boolean</td>
                        <td>true_false</td>
                        <td>CHAR(1)('Y'或'N')</td>
                    </tr>
                    <tr>
                        <td>java.util.Date、java.sql.Date</td>
                        <td>date</td>
                        <td>DATE</td>
                    </tr>
                    <tr>
                        <td>java.util.Date、java.sql.Time</td>
                        <td>time</td>
                        <td>TIME</td>
                    </tr>
                    <tr>
                        <td>java.util.Date、java.sql.Timestamp</td>
                        <td>timestamp</td>
                        <td>TIMESTAMP</td>
                    </tr>
                    <tr>
                        <td>java.util.Calendar</td>
                        <td>calendar</td>
                        <td>TIMESTAMP</td>
                    </tr>
                    <tr>
                        <td>java.util.Calendar</td>
                        <td>calendar_date</td>
                        <td>DATE</td>
                    </tr>
                    <tr>
                        <td>byte[]</td>
                        <td>binary</td>
                        <td>VARBINARY、BLOB</td>
                    </tr>
                    <tr>
                        <td>java.lang.String</td>
                        <td>text</td>
                        <td>CLOB</td>
                    </tr>
                    <tr>
                        <td>java.io.Serializable</td>
                        <td>serializable</td>
                        <td>VARBINARY、BLOB</td>
                    </tr>
                    <tr>
                        <td>java.sql.Clob</td>
                        <td>clob</td>
                        <td>CLOB</td>
                    </tr>
                    <tr>
                        <td>java.sql.Blob</td>
                        <td>blob</td>
                        <td>BLOB</td>
                    </tr>
                    <tr>
                        <td>java.lang.Class</td>
                        <td>class</td>
                        <td>VARCHAR</td>
                    </tr>
                    <tr>
                        <td>java.util.Locale</td>
                        <td>locale</td>
                        <td>VARCHAR</td>
                    </tr>
                    <tr>
                        <td>java.util.TimeZone</td>
                        <td>timezone</td>
                        <td>VARCHAR</td>
                    </tr>
                    <tr>
                        <td>java.util.Currency</td>
                        <td>currency</td>
                        <td>VARCHAR</td>
                    </tr>
                </tbody>
            </table>
            </span></td>
        </tr>
        <tr>
            <td valign="bottom" colspan="2" height="40">文章来源:<a href="http://www.blogjava.net/haoqingshi/articles/10912.html" target="_blank">http://www.blogjava.net/haoqingshi/articles/10912.html</a></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/i369/aggbug/190588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-04-03 12:39 <a href="http://www.blogjava.net/i369/articles/190588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让Hibernate输出SQL语句以便更加深入调试程序----参数配置</title><link>http://www.blogjava.net/i369/articles/180461.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 18 Feb 2008 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/180461.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/180461.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/180461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/180461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/180461.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
在J2ee应用中，如果采用Hibernate框架，可以自动建立数据库实体与Java实体类的映射关系，大大方便Java程序进行持久化对象访问和操作，从而明显提高企业应用开发效率，减轻Java程序与后台数据库的依赖性。<br />
<br />
但是，有时候如果操作不慎，可能造成映射关系不完整（特别是存在外键链接的时候），造成访问数据库对象时程序有Bug。这时，可以通过参数配置，让Hibernate在每次需要从数据库查询记录或者每次插入、更新数据库记录时，将相应的SQL语句输出到控制台，从而了解具体的数据库操作，更好地进行程序调试。<br />
<br />
方法是：<br />
1、打开<strong>hibernate.cfg.xml</strong>文件编辑界面，在Properties窗口处，点击<strong>Add</strong>按钮，选择<strong>Show_SQL</strong>参数，输入值为<strong>True</strong>。如下图：<br />
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/panqf/pic/item/71da8c11a3e8c77bcb80c44d.jpg" border="0" small="0"  alt="" /></div>
<br />
<br />
2、保存<strong>hibernate.cfg.xml。<br />
<br />
</strong>这时，再次运行你的程序，在控制台视图中将会显示相应的SQL语句。<br />
<br />
另外，如果按照同样的步骤，分别加入以下参数，可以让SQL语句更加完美：<br />
1）参数：format_sql=true&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 使SQL语句格式更加美观统一；<br />
2）参数：use_sql_comments=true &nbsp;&nbsp; &nbsp;&nbsp; 使SQL语句中自动注入注释，增加可读性<br />
下图是输出结果的例子：<br />
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/panqf/pic/item/23297208870a65900a7b825f.jpg" border="0" small="0"  alt="" /></div>
<br />
<br />
除此之外，Hibernate还有很多参数，通过合理配置这些参数，可以对提高Hibernate框架下对象的效率，从而实现对J2ee应用的优化。<br />
这些参数如下：<br />
<font color="#ffffff">Java,IdeaGrace,web,开发,技术,交流,教程 - http://www.ideagrace.com </font><br />
<table summary="Hibernate配置属性    " 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>表 3.4. Hibernate JDBC和连接(connection)属性 </strong></p>
<table summary="Hibernate JDBC和连接(connection)属性    " border="1">
    <colgroup>
    <col></col>
    <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>表 3.5. Hibernate缓存属性 </strong></p>
<table summary="Hibernate缓存属性    " border="1">
    <colgroup>
    <col></col>
    <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>表 3.6. Hibernate事务属性 </strong></p>
<table summary="Hibernate事务属性    " border="1">
    <colgroup>
    <col></col>
    <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>表 3.7. 其他属性 </strong></p>
<table summary="其他属性    " border="1">
    <colgroup>
    <col></col>
    <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">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="configuration-optional-dialects"></a>3.4.1. 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>表 3.8. Hibernate SQL方言 (<tt class="literal"><font face="新宋体">hibernate.dialect</font></tt>) </strong></p>
<table summary="Hibernate SQL方言 (hibernate.dialect)    " border="1">
    <colgroup>
    <col></col>
    <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>表 3.9. Hibernate日志类别 </strong></p>
<table summary="Hibernate日志类别    " border="1">
    <colgroup>
    <col></col>
    <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>表 3.10. JTA TransactionManagers</strong></p>
<table summary="JTA TransactionManagers" border="1">
    <colgroup>
    <col></col>
    <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 />
<br />
（完）<br />
<br />
<div class="postTitle"><a class="postTitle2" href="http://www.blogjava.net/qclass/archive/2006/08/21/64692.html">采用p6spy完整显示hibernate的SQL语句</a> </div>
<p>&nbsp;&nbsp;&nbsp; 虽然在hibernate中有show_sql选项，但是显示出来的语句大多类似<br />
&nbsp;&nbsp;&nbsp; select * from xxx where value=?<br />
&nbsp;&nbsp;&nbsp; 但是有时候我们需要得到完整的SQL语句，怎么办呢？使用P6SPY就可以完成这个任务</p>
<p>&nbsp;&nbsp;&nbsp; p6spy是一个开源软件，它可以跟踪任何使用jdbc的应用产生的数据库操作。特别适合于监控ejb服务器产生的 sql statements。<br />
&nbsp;&nbsp;&nbsp; 官方网址：<a href="http://www.p6spy.com/">http://www.p6spy.com/</a><br />
&nbsp;&nbsp;&nbsp; 目前p6spy 适用的应用服务器包括jboss, atg, orion, jonas, iplanet, weblogic, websphere, resin and tomcat.</p>
<p>下面我介绍一下p6spy在tomcat应用程序上安装的步骤：<br />
（1）<a href="http://www.p6spy.com/download.html">http://www.p6spy.com/download.html</a>，下载zip包<br />
（2）解压出p6spy.jar spy.properties两个文件<br />
（3）将p6spy.jar 放入应用程序的WEB-INF/lib目录，将spy.properties放入WEB-INF/classes目录<br />
（4）修改spy.properties</p>
<p>&nbsp;&nbsp;&nbsp; realdriver&nbsp; =com.mysql.jdbc.Driver&nbsp; 将这行前面的#去掉<br />
&nbsp;&nbsp;&nbsp; logfile&nbsp;&nbsp;&nbsp;&nbsp; = c:/spy.log&nbsp; 修改一个你需要的日志文件名<br />
&nbsp;&nbsp;&nbsp; <br />
（5）修改hibernate.xml，修改connection.driver_class的值为com.p6spy.engine.spy.P6SpyDriver<br />
（6）重启tomcat<br />
（7）这样在c:/下的spy.log记录了数据库的访问情况。</p>
<br />
<p><br />
</p>
<p>-----------------------------------------</p>
<p>1.下载附件的p6psy.jar以及spy.properties文件</p>
<p>2.将<span class="hilite1">p6spy</span>.jar放到应用的lib目录下,将spy.properties放到WEB-INF\classes目录下</p>
<p>3.修改spy.properties样本的第41行。改成需要的数据库信息 <br />
修改spy.properties样本的第54行 。改成需要的数据库信息<br />
<br />
修改spy.properties样本的第168行，将spy.log放到比较好找的位置： <br />
例如：logfile = E:/spy.log</p>
<p>4.驱动程序加载先后的问题解决 <br />
　　如果spy.log里出现 <br />
　　你的程序的数据库驱动名称 is a real driver in spy.properties, but it has been loaded before <span class="hilite1">p6spy</span>. <span class="hilite1">p6spy</span> will not wrap these connections. Either prevent the driver from loading, or try setting 'deregisterdrivers' to true in spy.properties <br />
　　请把spy.properties文件里的deregisterdrivers=false改为deregisterdrivers=true，重新运行即可。</p>
<p>5.在<span class="hilite2">spring</span>配置文件中配置如下:</p>
<ol class="dp-xml">
    <li class="alt"><span><span class="comments">&lt;!-- <span class="hilite1">P6SPY</span> dataSource target --&gt;</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"dataSourceTarget"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.<span class="hilite2">spring</span>framework.jdbc.datasource.DriverManagerDataSource"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"driverClassName"</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"oracle.jdbc.OracleDriver"</span><span> </span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"url"</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"jdbc:oracle:thin:@localhost:1521:testdb"</span><span> </span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"username"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"tet"</span><span> </span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"password"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"test"</span><span> </span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;&nbsp; dataSource --&gt;</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"dataSource4develop"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.<span class="hilite1">p6spy</span>.engine.spy.P6DataSource"</span><span> </span><span class="attribute">destroy-method</span><span>=</span><span class="attribute-value">"close"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">constructor-arg</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">ref</span><span> </span><span class="attribute">local</span><span>=</span><span class="attribute-value">"dataSourceTarget"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">constructor-arg</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
</ol>
<img src ="http://www.blogjava.net/i369/aggbug/180461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-02-18 14:33 <a href="http://www.blogjava.net/i369/articles/180461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate条件查询(Criteria Query) </title><link>http://www.blogjava.net/i369/articles/154089.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 19 Oct 2007 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/154089.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/154089.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/154089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/154089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/154089.html</trackback:ping><description><![CDATA[<p><font size="2"><font color="#000000"><strong>1、创建一个Criteria实例</strong><br />
net.sf.hibernate.Criteria这个接口代表对一个特定的持久化类的查询。Session是用来制造Criteria实例的工厂。&nbsp;</font></font></p>
<p><font color="#000000" size="2">Criteria&nbsp;crit&nbsp;=&nbsp;sess.createCriteria(Cat.class);<br />
crit.setMaxResults(50);<br />
List&nbsp;cats&nbsp;=&nbsp;crit.list();</font></p>
<p><font color="#000000" size="2">返回最多50条记录的结果集。</font></p>
<p><font size="2"><font color="#000000"><strong>2、缩小结果集范围</strong><br />
一个查询条件(Criterion)是net.sf.hibernate.expression.Criterion接口的一个实例。类net.sf.hibernate.expression.Expression定义了获得一些内置的Criterion类型。&nbsp;</font></font></p>
<p><font color="#000000" size="2">List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like("name",&nbsp;"Fritz%")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.between("weight",&nbsp;minWeight,&nbsp;maxWeight)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
表达式（Expressions）可以按照逻辑分组.&nbsp;</font></p>
<p><font color="#000000" size="2">List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like("name",&nbsp;"Fritz%")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.or(<br />
&nbsp;&nbsp;&nbsp;&nbsp; Expression.eq(&nbsp;"age",&nbsp;new&nbsp;Integer(0)&nbsp;),<br />
&nbsp;&nbsp;&nbsp;&nbsp; Expression.isNull("age")<br />
&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();</font></p>
<p><font color="#000000" size="2">返回（name like "Fritz%" and age 等于0 或者 age 为空）的结果集<br />
<br />
<br />
List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.in(&nbsp;"name",&nbsp;new&nbsp;String[]&nbsp;{&nbsp;"Fritz",&nbsp;"Izi",&nbsp;"Pk"&nbsp;}&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.disjunction()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.isNull("age")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp; .add(&nbsp;Expression.eq("age",&nbsp;new&nbsp;Integer(0)&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp; .add(&nbsp;Expression.eq("age",&nbsp;new&nbsp;Integer(1)&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp; .add(&nbsp;Expression.eq("age",&nbsp;new&nbsp;Integer(2)&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();</font></p>
<p><font color="#000000" size="2">Expression.disjunction()----意思是可以按照逻辑分组<br />
有很多预制的条件类型（Expression的子类）。有一个特别有用，可以让你直接嵌入SQL。&nbsp;</font></p>
<p><font color="#000000" size="2">List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.sql("lower($alias.name)&nbsp;like&nbsp;lower(?)",&nbsp;"Fritz%",&nbsp;Hibernate.STRING)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
其中的{alias}是一个占位符，它将会被所查询实体的行别名所替代。(原文:The&nbsp;{alias}&nbsp;placeholder&nbsp;with&nbsp;be&nbsp;replaced&nbsp;by&nbsp;the&nbsp;row&nbsp;alias&nbsp;of&nbsp;the&nbsp;queried&nbsp;entity.)&nbsp;</font></p>
<p><font size="2"><font color="#000000"><strong>3、对结果排序</strong><br />
可以使用net.sf.hibernate.expression.Order对结果集排序.&nbsp;</font></font></p>
<p><font color="#000000" size="2">List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like("name",&nbsp;"F%")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.asc("name")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.desc("age")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setMaxResults(50)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<strong>4、关联（Associations）</strong><br />
你可以在关联之间使用createCriteria()，很容易地在存在关系的实体之间指定约束。&nbsp;</font></p>
<p><font color="#000000" size="2">List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like("name",&nbsp;"F%")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria("kittens")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like("name",&nbsp;"F%")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
注意，第二个createCriteria()返回一个Criteria的新实例，指向kittens集合类的元素。&nbsp;</font></p>
<p><font color="#000000" size="2">下面的替代形式在特定情况下有用。&nbsp;</font></p>
<p><font color="#000000" size="2">List&nbsp;cats&nbsp;=&nbsp;</font><font size="2"><font color="#000000"><strong>sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createAlias("kittens",&nbsp;"kt")<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;.createAlias("mate",&nbsp;"mt")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.eqProperty("kt.name",&nbsp;"mt.name")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
（createAlias()）并不会创建一个Criteria的新实例。）&nbsp;</font></font></p>
<p><font color="#000000" size="2">请注意，前面两个查询中Cat实例所持有的kittens集合类并没有通过criteria预先过滤！如果你希望只返回满足条件的kittens,你必须使用returnMaps()。&nbsp;</font></p>
<p><font color="#000000" size="2">List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria("kittens",&nbsp;"kt")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.eq("name",&nbsp;"F%")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.returnMaps()<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
Iterator&nbsp;iter&nbsp;=&nbsp;cats.iterator();<br />
while&nbsp;(&nbsp;iter.hasNext()&nbsp;)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;=&nbsp;(Map)&nbsp;iter.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;cat&nbsp;=&nbsp;(Cat)&nbsp;map.get(Criteria.ROOT_ALIAS);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;kitten&nbsp;=&nbsp;(Cat)&nbsp;map.get("kt");<br />
}<br />
</font><font size="2"><font color="#000000"><strong>5、动态关联对象获取（Dynamic&nbsp;association&nbsp;fetching）<br />
</strong>可以在运行时通过setFetchMode()来改变关联对象自动获取的策略。&nbsp;</font></font></p>
<p><font color="#000000" size="2">List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like("name",&nbsp;"Fritz%")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setFetchMode("mate",&nbsp;FetchMode.EAGER)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
这个查询会通过外连接(outer&nbsp;join)同时获得&nbsp;mate和kittens。&nbsp;</font></p>
<p><font size="2"><font color="#000000"><strong>6、根据示例查询（Example&nbsp;queries）</strong><br />
net.sf.hibernate.expression.Example类允许你从指定的实例创造查询条件。&nbsp;</font></font></p>
<p><font color="#000000" size="2">Cat&nbsp;cat&nbsp;=&nbsp;new&nbsp;Cat();<br />
cat.setSex('F');<br />
cat.setColor(Color.BLACK);<br />
List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Example.create(cat)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
版本属性，表示符属性和关联都会被忽略。默认情况下，null值的属性也被排除在外。&nbsp;</font></p>
<p><font color="#000000" size="2">You&nbsp;can&nbsp;adjust&nbsp;how&nbsp;the&nbsp;Example&nbsp;is&nbsp;applied.&nbsp;你可以调整示例(Example)如何应用。&nbsp;</font></p>
<p><font color="#000000" size="2">Example&nbsp;example&nbsp;=&nbsp;Example.create(cat)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.excludeZeroes()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//exclude&nbsp;zero&nbsp;valued&nbsp;properties<br />
&nbsp;&nbsp;&nbsp;&nbsp;.excludeProperty("color")&nbsp;&nbsp;//exclude&nbsp;the&nbsp;property&nbsp;named&nbsp;"color"<br />
&nbsp;&nbsp;&nbsp;&nbsp;.ignoreCase()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//perform&nbsp;case&nbsp;insensitive&nbsp;string&nbsp;comparisons<br />
&nbsp;&nbsp;&nbsp;&nbsp;.enableLike();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//use&nbsp;like&nbsp;for&nbsp;string&nbsp;comparisons<br />
List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.add(example)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
你甚至可以用示例对关联对象建立criteria。&nbsp;</font></p>
<p><font color="#000000" size="2">List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Example.create(cat)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria("mate")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Example.create(&nbsp;cat.getMate()&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
</font></p>
<img src ="http://www.blogjava.net/i369/aggbug/154089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-19 09:48 <a href="http://www.blogjava.net/i369/articles/154089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的检索策略小结</title><link>http://www.blogjava.net/i369/articles/153543.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Wed, 17 Oct 2007 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/153543.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/153543.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/153543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/153543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/153543.html</trackback:ping><description><![CDATA[Hibernate的检索策略包括类级别检索策略和关联级别检索策略。
<p>　　类级别检索策略有立即检索和延迟检索，默认的检索策略是立即检索。在Hibernate映射文件中，通过在&lt;class&gt;上配置lazy属性来确定检索策略。对于Session的检索方式，类级别检索策略仅适用于load方法；也就说，对于get、qurey检索，持久化对象都会被立即加载而不管lazy是false还是true.一般来说，我们检索对象就是要访问它，因此立即检索是通常的选择。由于load方法在检索不到对象时会抛出异常（立即检索的情况下），因此我个人并不建议使用load检索；而由于&lt;class&gt;中的lazy属性还影响到多对一及一对一的检索策略，因此使用load方法就更没必要了。</p>
<p>　　关联级别检索策略有立即检索、延迟检索和迫切左外连接检索。对于关联级别检索，又可分为一对多和多对多、多对一和一对一两种情况讨论。</p>
<p>　　一对多和多对多关联关系一般使用&lt;set&gt;配置。&lt;set&gt;有lazy和outer-join属性，它们的不同取值绝对了检索策略。</p>
<p>　　1）立即检索：这是一对多默认的检索策略，此时lazy=false，outer-join=false.尽管这是默认的检索策略，但如果关联的集合是无用的，那么就不要使用这种检索方式。</p>
<p>　　2）延迟检索：此时lazy=true，outer-join=false（outer-join=true是无意义的），这是优先考虑的检索方式。</p>
<p>　　3）迫切左外连接检索：此时 lazy=false，outer-join=true，这种检索策略只适用于依靠id检索方式（load、get），而不适用于query的集合检索（它会采用立即检索策略）。相比于立即检索，这种检索策略减少了一条sql语句，但在Hibernate中，只能有一个&lt;set&gt;配置成 outer-join=true.</p>
<p>　　多对一和一对一检索策略一般使用&lt;many-to-one&gt;、&lt;one-to-one&gt;配置。&lt;many-to-one&gt;中需要配置的属性是 outer-join，同时还需要配置one端关联的&lt;class&gt;的lazy属性（配置的可不是&lt;many-to-one&gt;中的lazy哦），它们的组合后的检索策略如下：</p>
<p>　　1） outer-join=auto：这是默认值，如果lazy=true为延迟检索，如果lazy=false为迫切左外连接检索。</p>
<p>　　2） outer-join=true，无关于lazy，都为迫切左外连接检索。</p>
<p>　　3） outer-join=false，如果lazy=true为延迟检索，否则为立即检索。</p>
<p>　　可以看到，在默认的情况下（outer-join=auto，lazy=false），对关联的one端对象Hibernate采用的迫切左外连接检索。依我看，很多情况下，我们并不需要加载one端关联的对象（很可能我们需要的仅仅是关联对象的id）；另外，如果关联对象也采用了迫切左外连接检索，就会出现select语句中有多个外连接表，如果个数多的话会影响检索性能，这也是为什么Hibernate通过hibernate.max_fetch_depth属性来控制外连接的深度。对于迫切左外连接检索，query的集合检索并不适用，它会采用立即检索策略。</p>
<p>　　对于检索策略，需要根据实际情况进行选择。对于立即检索和延迟检索，它们的优点在于select语句简单（每张表一条语句）、查询速度快，缺点在于关联表时需要多条select语句，增加了访问数据库的频率。因此在选择即检索和延迟检索时，可以考虑使用批量检索策略来减少select语句的数量（配置batch-size属性）。对于切左外连接检索，优点在于select较少，但缺点是select语句的复杂度提高，多表之间的关联会是很耗时的操作。另外，配置文件是死的，但程序是活的，可以根据需要在程序里显示的指定检索策略（可能经常需要在程序中显示指定迫切左外连接检索）。为了清楚检索策略的配置效果如何，可以配置show_sql属性查看程序运行时Hibernate执行的sql语句。</p>
<br />
<br />
<div class="postTitle"><iframe style="margin-top: 0px; float: left" border="0" marginwidth="0" framespacing="0" marginheight="0" src="http://wz.csdn.net/vote.aspx?t=Hibernate%u7684fetch%3D%22join%22%20%u548C%20fetch%3D%22select%22%20%u7684%u4E00%u70B9%u641C%u96C6%20-%20%u6211%u7684%u4E16%u754C%u6211%u7684%u68A6%20-%20CSDNBlog&amp;u=http%3A//blog.csdn.net/daryl715/archive/2007/08/23/1755222.aspx" frameborder="0" noResize width="54" scrolling="no" height="75"></iframe><a href="http://blog.csdn.net/daryl715/archive/2007/08/23/1755222.aspx">Hibernate的fetch="join" 和 fetch="select" 的一点搜集 </a>&nbsp;&nbsp; <script src="http://blog.csdn.net/count.aspx?ID=1755222&amp;Type=Rank"></script><span title="文章指数:36"><img src="http://blog.csdn.net/images/star.gif" border="0"  alt="" /><img src="http://blog.csdn.net/images/star_half.gif" border="0"  alt="" /></span>&nbsp;&nbsp;<img title="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" alt="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" src="http://blog.csdn.net/images/ask.gif" border="0" /> </div>
<div class="postText">
<p>fetch参数指定了关联对象抓取的方式是select查询还是join查询，select方式时先查询返回要查询的主体对象（列表），再根据关联外键id，每一个对象发一个select查询，获取关联的对象，形成n+1次查询； <br />
而join方式，主体对象和关联对象用一句外键关联的sql同时查询出来，不会形成多次查询。 <br />
如果你的关联对象是延迟加载的，它当然不会去查询关联对象。 <br />
另外，在hql查询中配置文件中设置的join方式是不起作用的（而在所有其他查询方式如get、criteria或再关联获取等等都是有效的），会使用select方式，除非你在hql中指定join fetch某个关联对象。</p>
<p>&nbsp;</p>
<p>fetch策略用于定义 get/load一个对象时，如何获取非lazy的对象/集合。 这些参数在Query中无效。</p>
<p>fetch策略用于定义 get/load一个对象时，如何获取非lazy的对象/集合。 这些参数在Query中无效。</p>
<p>在某种特殊的场合下，fetch在hql中还是起作用的。 <br />
例如 <br />
<span style="color: blue">现有message(回帖)--&gt;topic(主贴)--&gt;forum(版块) 的多级many-to-one结构: <br />
第一级:message--&gt;topic many-to-one配置lazy="false" fetch="join" <br />
第二级:topic--&gt;forum many-to-one配置lazy="false" fetch="join"</span> <br />
这时如果"from message",则第二级:topic--&gt;forum中的fetch策略会起作用&nbsp;</p>
<p>&nbsp;</p>
<p>查询抓取（默认的）在N+1查询的情况下是极其脆弱的，因此我们可能会要求在映射文档中定义使用连接抓取： </p>
<p>&nbsp;</p>
<p>&lt;set name="permissions" <br />
fetch="join"&gt; <br />
&lt;key column="userId"/&gt; <br />
&lt;one-to-many class="Permission"/&gt; <br />
&lt;/set <br />
&lt;many-to-one name="mother" class="Cat" fetch="join"/&gt; <br />
在映射文档中定义的抓取策略将会有产生以下影响： </p>
<p>通过get()或load()方法取得数据。 </p>
<p>只有在关联之间进行导航时，才会隐式的取得数据(延迟抓取)。 </p>
<p>条件查询 </p>
<p>在映射文档中显式的声明 连接抓取做为抓取策略并不会影响到随后的HQL查询。 </p>
<p>通常情况下，我们并不使用映射文档进行抓取策略的定制。更多的是，保持其默认值，然后在特定的事务中， 使用HQL的左连接抓取（left join fetch） 对其进行重载。这将通知 Hibernate在第一次查询中使用外部关联（outer join），直接得到其关联数据。 在条件查询 API中，应该调用 setFetchMode(FetchMode.JOIN)语句。 <br />
</p>
<p>其实这并不能说明hql能够按照配置文件设置的join进行抓取，这时 第二级:topic--&gt;forum 的抓取其实已经和hql没有关系了，因为前面已经产生了另一个select方式的抓取语句。 <br />
而是对象的关联获取，假如查询message时topic是设置为延迟加载的，那么在后面获取message.topic时，如topic.forum不延迟加载，那么topic--&gt;forum会实现配置的join方式的抓取，这个显然和hql查询没有关系。</p>
<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1755222</p>
</div>
<div class="postTitle"><iframe style="margin-top: 0px; float: left" border="0" marginwidth="0" framespacing="0" marginheight="0" src="http://wz.csdn.net/vote.aspx?t=hibernate%u96C6%u5408%u6620%u5C04inverse%u548Ccascade%u8BE6%u89E3%20-%20WangSY%20-%20CSDNBlog&amp;u=http%3A//blog.csdn.net/xiandelaji/archive/2007/09/13/1782982.aspx" frameborder="0" noResize width="54" scrolling="no" height="75"></iframe><a href="http://blog.csdn.net/xiandelaji/archive/2007/09/13/1782982.aspx"><img height="13" src="http://blog.csdn.net/images/zhuan.gif" width="15" border="0"  alt="" />&nbsp;hibernate集合映射inverse和cascade详解</a>&nbsp;&nbsp; <script src="http://blog.csdn.net/count.aspx?ID=1782982&amp;Type=Rank"></script><img title="文章指数:0" alt="文章指数:0" src="http://blog.csdn.net/images/star_0.gif" border="0" />&nbsp;&nbsp;<img title="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" alt="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" src="http://blog.csdn.net/images/ask.gif" border="0" /> </div>
<div class="postText"><font size="2">&nbsp; </font>
<h4 class="TextColor1" id="subjcns!3196CAE67CDF2316!149" style="margin-bottom: 0px" align="center"><font size="2">hibernate集合映射inverse和cascade详解</font></h4>
<p><font size="2">１、到底在哪用cascade="..."？</font></p>
<p><font size="2">cascade属性并不是多对多关系一定要用的，有了它只是让我们在插入或删除对像时更方便一些，只要在cascade的源头上插入或是删除，所有cascade的关系就会被自己动的插入或是删除。便是为了能正确的cascade，unsaved-value是个很重要的属性。Hibernate通过这个属性来判断一个对象应该save还是update，如果这个对象的id是unsaved-value的话，那说明这个对象不是persistence object要save（insert)；如果id是非unsaved-value的话，那说明这个对象是persistence object（数据库中已存在），只要update就行了。saveOrUpdate方法用的也是这个机制。</font></p>
<p><font size="2">２、到底在哪用inverse="ture"?</font></p>
<p><font size="2">inverse属性默认是false的，就是说关系的两端都来维护关系。这个意思就是说，如有一个Student, Teacher和TeacherStudent表，Student和Teacher是多对多对多关系，这个关系由TeacherStudent这个表来表现。那么什么时候插入或删除TeacherStudent表中的记录来维护关系呢？在用hibernate时，我们不会显示的对TeacherStudent表做操作。对TeacherStudent的操作是hibernate帮我们做的。hibernate就是看hbm文件中指定的是"谁"维护关系，那个在插入或删除"谁"时，就会处发对关系表的操作。前提是"谁"这个对象已经知道这个关系了，就是说关系另一头的对象已经set或是add到"谁"这个对象里来了。前面说过inverse默认是false，就是关系的两端都维护关系，对其中任一个操作都会处发对表系表的操作。当在关系的一头，如Student中的bag或set中用了inverse＝"true"时，那就代表关系是由另一关维护的（Teacher）。就是说当这插入Student时，不会操作TeacherStudent表，即使Student已经知道了关系。只有当Teacher插入或删除时才会处发对关系表的操作。所以，当关系的两头都用inverse="true"是不对的，就会导致任何操作都不处发对关系表的操作。当两端都是inverse="false"或是default值是，在代码对关系显示的维护也是不对的，会导致在关系表中插入两次关系。</font></p>
<p><font size="2">在一对多关系中inverse就更有意义了。在多对多中，在哪端inverse="true"效果差不多（在效率上）。但是在一对多中，如果要一方维护关系，就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。而如果让"多"方面维护关系时就不会有update操作，因为关系就是在多方的对象中的，直指插入或是删除多方对象就行了。当然这时也要遍历"多"方的每一个对象显示的操作修关系的变化体现到DB中。不管怎样说，还是让"多"方维护关系更直观一些。</font></p>
<p><font size="2">３、cascade和inverse有什么区别？</font></p>
<p><font size="2">可以这样理解，cascade定义的是关系两端对象到对象的级联关系；而inverse定义的是关系和对象的级联关系。</font></p>
<p><font size="2"></font></p>
<p><a href="http://welcomejianghome.spaces.msn.com/blog/cns!3196CAE67CDF2316!149.entry" target="blank"><u><font size="2"></font></u></a></p>
<font size="2">all : 所有情况下均进行关联操作。 <br />
none：所有情况下均不进行关联操作。这是默认值。 <br />
save-update:在执行save/update/saveOrUpdate时进行关联操作。 <br />
delete：在执行delete时进行关联操作。 </font>
<p>&nbsp;</p>
<p><font size="2">all的意思是save-update + delete <br />
all-delete-orphan 的意思是当对象图中产生孤儿节点时,在数据库中删除该节点 <br />
all比较好理解,举个例子说一下all-delete-orphan: <br />
Category与Item是一对多的关系,也就是说Category类中有个Set类型的变量items. <br />
举个例子,现items中存两个Item, item1,item2,如果定义关系为all-delete-orphan <br />
当items中删除掉一个item(比如用remove()方法删除item1),那么被删除的Item类实例 <br />
将变成孤儿节点,当执行category.update(),或session.flush()时 <br />
hibernate同步缓存和数据库,会把数据库中item1对应的记录删掉 </font></p>
<p><font size="2">//////////////////////////////////////////////////////////////////////////////////////////////////////////</font></p>
<p><font size="2">///////////////////////////////////////////////////////////////////////////////////////////////////////////</font></p>
<div class="bvMsg"><span dir="ltr"><span><font size="2">﻿4. hibernate如何根据pojo来更新数据库<br />
<br />
4.0&nbsp; 在commit/flush之前，hibernate不会对pojo对象作神秘的处理。<br />
4.0.1 在select查询出pojo时，hibernate根据&#8220;字段--属性&#8221;的对应关系，用字段的值填充pojo的属性；<br />
然后根据&#8220;关系标记&#8221;生成sql语句从relationTable中查询出满足条件的relationPojo，并把这些relatinPojo<br />
放到&#8220;关系属性&#8221;中。这个过程是机械的。<br />
<br />
4.0.2 在pojo对象被查出来后，到commit(或flush)之前，它将是一个普通的java对象，hibernate不会做额外的手脚。<br />
比如，不会限制你设置一个属性的值为null或其它任何值<br />
在集合类Set的add(object)操作时， 不会改变object的值，不会检查参数object是否是一个pojo对象<br />
设置mainPojo的一个&#8220;桥属性&#8221;的值，不会自动设置relationPojo的对应的&#8220;桥属性&#8221;的值。<br />
执行session.delete(pojo)时，pojo本身没有变化，他的属性值也没有变化。<br />
执行session.save(pojo)时，如果pojo的id不是hibernate或数据库生成,则它的值没有变化。<br />
&nbsp; 如果pojo的id是hibernate或数据库生成，则hibernate会把id给pojo设上去。<br />
<br />
extend: 对lazy=true的set，hibernate在进行set的操作(调用java.util.Set中声明的方法)时<br />
会先inialize这个set，仅此而已。而inialize仅仅是从数据库中捞出set的数据。 <br />
如果一个set已经被inialize了，那么对它进行的操作就是java.util.Set接口中定义的语义。<br />
<br />
另外，如果id由hibernate来生成，那么在save(pojo)时，hibernate会改变该pojo，会设置它的id，这<br />
可能改变该pojo的hashCode，详细地讨论见帖《》<br />
<br />
mapping文件中标记的某些属性及pojo对象的操作会对数据库操作产生影响，这些影响都是在commit时才会起作用。<br />
而在commit前pojo的状态不受它们的影响。<br />
<br />
不过，待commit之时，将由hibernate完全掌控，它好像知道pojo对象从创建到commit这中间的所有变化。<br />
<br />
<br />
4.01. 关联更新<br />
"关系标记"对应的属性是一个pojo或一个pojo的集合，修改&#8220;关系属性&#8221;的值能会导致更新mainTable表，也可能会更新relationTable表。<br />
<br />
这种更新暂叫&#8220;关联更新&#8221;。<br />
<br />
<br />
4.1.inverse属性的作用（假定没有设置cascade属性） <br />
4.1.1 &#8220;只有集合标记（set/map/list/array/bag）才有inverse属性&#8221;。<br />
————不妨以标记set为例，具体为&#8220;一个地区（Address表）的学校（School表）&#8221; -- address.schoolSet。<br />
<br />
4.1.2 &#8220;set的inverse属性决定是否把对set的改动反映到数据库中去。<br />
inverse=false————反映；inverse=true————不反映&#8221;<br />
inverse属性默认为false<br />
<br />
对&lt;one-to-many&gt;和&lt;many-to-many&gt;子标记，这两条都适用。<br />
不管是对set做什么操作，4.1.2都适用。<br />
<br />
4.1.3当inverse=false时，hibernate如何将对set的改动反映到数据库中：<br />
<br />
对set的操作主要有：（1）新增元素 address.getSchoolSet().add(oneSchool);<br />
（2）删除元素 address.getSchoolSet().remove(oneSchool);<br />
（3）删除set&nbsp; address.setSchoolSet(null);<br />
（4）设新set&nbsp; address.setSchoolSet( newSchoolSet);<br />
（5）转移set&nbsp; otherSchoolSet = otherAddress.getSchoolSet();<br />
&nbsp; otherAddress.setSchoolSet(null);<br />
&nbsp; address.setSchoolSet(otherSchoolSet);<br />
（6）改变set中元素的属性的值&nbsp; 如果是改变key属性，这会导致异常<br />
&nbsp; 如果改变的是普通的属性，则hibernate认为set没有变化（在后面可以看出缘由）。<br />
&nbsp; 所以这种情形不予考虑。<br />
&nbsp; <br />
改变set后，hibernate对数据库的操作根据是&lt;one-to-many&gt;关系还是&lt;many-to-many&gt;关系而有不同。<br />
<br />
对one-to-many，对school set的改动，会改变表SCHOOL中的数据:<br />
&nbsp; #SCHOOL_ID是school表的主键，SCHOOL_ADDRESS是school表中的地址栏位<br />
&nbsp; #表School的外键为SCHOOL_ADDRESS，它对应表Address的主键ADDRESS_ID<br />
（11）insert oneSchool———— sqlInsertRowString: <br />
update SCHOOL set SCHOOL_ADDRESS=? where SCHOOL_ID=? <br />
(仅仅update foreign-key的值。)<br />
（22）delete oneSchool———— sqlDeleteRowString: <br />
update SCHOOL set SCHOOL_ADDRESS=null where SCHOOL_ID=?<br />
（很奇怪，把foreign-key设置为null不知道有什么实际意义？）<br />
（33）delete 属于某一address的所有school ————sqlDeleteString：<br />
update SCHOOL set SCHOOL_ADDRESS=null where SCHOOL_ADDRESS=?<br />
（44）update ————sqlUpdateRowString：""， no need<br />
<br />
对many-to-many，对school set的改动，会改变关系表ADDRESS_SCHOOL中的数据:<br />
#&#8220;地区————学校&#8221;的关系为多对多的关系有点牵强，只是为了方便与上面的one-to-many作比较<br />
#假设有一个关系表ADDRESS_SCHOOL，有两个字段ADDRESS_ID, SCHOOL_ID，<br />
#这两个字段分别对应ADDRESS和SCHOOL两表的key<br />
（11）insert的SQL语句为： insert into ADDRESS_SCHOOL(ADDRESS_ID, SCHOOL_ID) <br />
values(?,?)<br />
（22）delete的SQL语句为： delete from ADDRESS_SCHOOL <br />
where ADDRESS_ID=? AND SCHOOL_ID=?<br />
（33）delete all的SQL语句为： delete from ADDRESS_SCHOOL<br />
where ADDRESS_ID=?<br />
（44）update的sql语句为 ————sqlUpdateRowString：<br />
update ADDRESS_SCHOOL set ADDRESS_ID=?<br />
where ADDRESS_ID=? AND SCHOOL_ID=?<br />
<br />
对set的操作(1),hibernate会执行(11)sqlInsertRowString<br />
对set的操作(2),hibernate会执行(22)sqlDeleteRowString<br />
对set的操作(3),hibernate会执行(33)sqlDeleteString<br />
对set的操作(4),老的schoolSet因为没有所属的address,所以被全部delete掉，即先执行(33)sqlDeleteString<br />
然后新增新的schoolSet,即再执行sqlInsertRowString<br />
对set的操作(5)，实际上就是将set从一个pojo转移到另一pojo：<br />
首先，执行sqlDeleteString，删除掉otherAddress所属的school<br />
然后，执行sqlDeleteString，删除掉address原先的school<br />
最后，执行sqlInsertRowString，将otherSchoolSet新增给address<br />
<br />
总结：（1）对one-to-many而言，改变set，会让hibernate执行一系列的update语句， 不会delete/insert数据<br />
（2）对many-to-many而言，改变set,只修改关系表的数据，不会影响many-to-many的另一方。<br />
（3）虽然one-to-many和many-to-many的数据库操作不一样，但目的都是一个：维护数据的一致性。执行的sql都<br />
只涉及到&#8220;桥字段&#8221;，不会考虑或改变其他的字段，所以对set的操作(6)是没有效果地。<br />
extend:对list,可能还会维护index字段。<br />
<br />
4.1.4 &#8220;inverse与cascade没有什么关系，互无牵扯。&#8221;<br />
commit后，这两个属性发挥作用的时机不同，hibernate会根据对pojo对象的改动，及cascade属性的设置，<br />
生成一系列的Action，比如UpdateAction,DeleteAction,InsertAction等，每个Action都有execute方法以执行对应的sql语句。<br />
待所有这