﻿<?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-Youngsun's Java World-文章分类-hibernate</title><link>http://www.blogjava.net/youngsun/category/32164.html</link><description>徘徊于牛A和牛C之间</description><language>zh-cn</language><lastBuildDate>Fri, 13 Jun 2008 15:19:51 GMT</lastBuildDate><pubDate>Fri, 13 Jun 2008 15:19:51 GMT</pubDate><ttl>60</ttl><item><title>hibernate条件查询(criteria query)</title><link>http://www.blogjava.net/youngsun/articles/207749.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Fri, 13 Jun 2008 12:40:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/207749.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/207749.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/207749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/207749.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/207749.html</trackback:ping><description><![CDATA[<span class="NewsContent">
<p>1、创建一个Criteria实例net.sf.hibernate.Criteria这个接口代表对一个特定的持久化类的查询。Session是用来制造Criteria实例的工厂。
<p>Criteria crit = sess.createCriteria(Cat.class);crit.setMaxResults(50);List cats = crit.list();
<p>2、缩小结果集范围一个查询条件(Criterion)是net.sf.hibernate.expression.Criterion接口的一个实例。类net.sf.hibernate.expression.Expression定义了获得一些内置的Criterion类型。
<p>List cats = sess.createCriteria(Cat.class) .add( Expression.like("name", "Fritz%") ) .add( Expression.between("weight", minWeight, maxWeight) ) .list();表达式（Expressions）可以按照逻辑分组.
<p>List cats = sess.createCriteria(Cat.class) .add( Expression.like("name", "Fritz%") ) .add( Expression.or( Expression.eq( "age", new Integer(0) ), Expression.isNull("age") ) ) .list();List cats = sess.createCriteria(Cat.class) .add( Expression.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) ) .add( Expression.disjunction() .add( Expression.isNull("age") ) .add( Expression.eq("age", new Integer(0) ) ) .add( Expression.eq("age", new Integer(1) ) ) .add( Expression.eq("age", new Integer(2) ) ) ) ) .list();有很多预制的条件类型（Expression的子类）。有一个特别有用，可以让你直接嵌入SQL。
<p>List cats = sess.createCriteria(Cat.class) .add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING) ) .list();其中的{alias}是一个占位符，它将会被所查询实体的行别名所替代。(原文:The {alias} placeholder with be replaced by the row alias of the queried entity.)
<p>3、对结果排序可以使用net.sf.hibernate.expression.Order对结果集排序.
<p>List cats = sess.createCriteria(Cat.class) .add( Expression.like("name", "F%") .addOrder( Order.asc("name") ) .addOrder( Order.desc("age") ) .setMaxResults(50) .list();4、关联（Associations）你可以在关联之间使用createCriteria()，很容易地在存在关系的实体之间指定约束。
<p>List cats = sess.createCriteria(Cat.class) .add( Expression.like("name", "F%") .createCriteria("kittens") .add( Expression.like("name", "F%") .list();注意，第二个createCriteria()返回一个Criteria的新实例，指向kittens集合类的元素。
<p>下面的替代形式在特定情况下有用。
<p>List cats = sess.createCriteria(Cat.class) .createAlias("kittens", "kt") .createAlias("mate", "mt") .add( Expression.eqProperty("kt.name", "mt.name") ) .list();（createAlias()）并不会创建一个Criteria的新实例。）
<p>请注意，前面两个查询中Cat实例所持有的kittens集合类并没有通过criteria预先过滤！如果你希望只返回满足条件的kittens,你必须使用returnMaps()。
<p>List cats = sess.createCriteria(Cat.class) .createCriteria("kittens", "kt") .add( Expression.eq("name", "F%") ) .returnMaps() .list();Iterator iter = cats.iterator();while ( iter.hasNext() ) { Map map = (Map) iter.next(); Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS); Cat kitten = (Cat) map.get("kt");}5、动态关联对象获取（Dynamic association fetching）可以在运行时通过setFetchMode()来改变关联对象自动获取的策略。
<p>List cats = sess.createCriteria(Cat.class) .add( Expression.like("name", "Fritz%") ) .setFetchMode("mate", FetchMode.EAGER) .list();这个查询会通过外连接(outer join)同时获得 mate和kittens。
<p>6、根据示例查询（Example queries）net.sf.hibernate.expression.Example类允许你从指定的实例创造查询条件。
<p>Cat cat = new Cat();cat.setSex('F');cat.setColor(Color.BLACK);List results = session.createCriteria(Cat.class) .add( Example.create(cat) ) .list();版本属性，表示符属性和关联都会被忽略。默认情况下，null值的属性也被排除在外。
<p>You can adjust how the Example is applied. 你可以调整示例(Example)如何应用。
<p>Example example = Example.create(cat) .excludeZeroes() //exclude zero valued properties .excludeProperty("color") //exclude the property named "color" .ignoreCase() //perform case insensitive string comparisons .enableLike(); //use like for string comparisonsList results = session.createCriteria(Cat.class) .add(example) .list();你甚至可以用示例对关联对象建立criteria。
<p>List results = session.createCriteria(Cat.class) .add( Example.create(cat) ) .createCriteria("mate") .add( Example.create( cat.getMate() ) ) .list();</span></p>
<img src ="http://www.blogjava.net/youngsun/aggbug/207749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-06-13 20:40 <a href="http://www.blogjava.net/youngsun/articles/207749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate小结</title><link>http://www.blogjava.net/youngsun/articles/207748.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Fri, 13 Jun 2008 12:37:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/207748.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/207748.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/207748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/207748.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/207748.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: new Draggable("related_topics");          一、PO的数据类型设置 int 还是Integer Integer 允许为 null Hibernate 既可以访问Field也可以访问Property，访问Property是只是调用getXXX()、setXXX()方法，因此在from Customer where c.name=&#8217;Tom...&nbsp;&nbsp;<a href='http://www.blogjava.net/youngsun/articles/207748.html'>阅读全文</a><img src ="http://www.blogjava.net/youngsun/aggbug/207748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-06-13 20:37 <a href="http://www.blogjava.net/youngsun/articles/207748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate3调用存储过程用法</title><link>http://www.blogjava.net/youngsun/articles/207746.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Fri, 13 Jun 2008 12:22:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/207746.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/207746.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/207746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/207746.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/207746.html</trackback:ping><description><![CDATA[<div class="blog_content">DB2中简单存储过程　selectAllUsers <br />
<br />
CREATE procedure selectAllUsers <br />
DYNAMIC RESULT SETS 1 <br />
BEGIN <br />
DECLARE temp_cursor1 CURSOR WITH RETURN TO CLIENT FOR <br />
SELECT * FROM test; <br />
OPEN temp_cursor1; <br />
END; <br />
<br />
映射文件中关于存储过程内容如下 <br />
<br />
&lt;hibernate-mapping package="com.unmi.vo"&gt; <br />
&lt;class name="Test" table="TEST"&gt; <br />
　　　　　............ <br />
&lt;/class&gt; <br />
<br />
&lt;sql-query callable="true" name="selectAllUsers"&gt; <br />
&lt;return alias="aa" class="Test"&gt; <br />
&lt;return-property name="oborqt" column="OBORQT"/&gt; <br />
&lt;return-property name="moorqt" column="MOORQT"/&gt; <br />
&lt;return-property name="roschn" column="ROSCHN"/&gt; <br />
&lt;return-property name="plandate" column="PLANDATE"/&gt; <br />
&lt;/return&gt; <br />
{ ? = call selectAllUsers() } <br />
&lt;/sql-query&gt; <br />
&lt;/hibernate-mapping&gt; <br />
<br />
{ ? = call selectAllUsers() } 也可以写成{ call selectAllUsers() }， <br />
如果有参数就写成 <br />
{ ? = call selectAllUsers(?,?,?) } <br />
代码中对query设置相应位置上的值就OK <br />
<br />
Java调用关键代码如下 <br />
<br />
Session session = HibernateUtil.currentSession(); <br />
Query query = session.getNamedQuery("selectAllUsers"); <br />
List list = query.list(); <br />
System.out.println(list); <br />
<br />
要求你的存储过程必须能返回记录集，否则要出错 <br />
如果你的存储过程是完成非查询任务就应该在配置文件用以下三个标签 <br />
&lt;sql-insert callable="true"&gt;{call createPerson (?, ?)}&lt;/sql-insert&gt; <br />
&lt;sql-delete callable="true"&gt;{? = call deletePerson (?)}&lt;/sql-delete&gt; <br />
&lt;sql-update callable="true"&gt;{? = call updatePerson (?, ?)}&lt;/sql-update&gt; <br />
<br />
有一点不好的地方就是调用存储过程获取记录集时，不能对Query使用 <br />
setFirstResult(int)和setMaxResults(int)方法来分页 </div>
<img src ="http://www.blogjava.net/youngsun/aggbug/207746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-06-13 20:22 <a href="http://www.blogjava.net/youngsun/articles/207746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中的事务控制和并发详解 （4）</title><link>http://www.blogjava.net/youngsun/articles/207515.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Thu, 12 Jun 2008 14:33:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/207515.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/207515.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/207515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/207515.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/207515.html</trackback:ping><description><![CDATA[<strong>12.3.3.脱管对象(deatched object)和自动版本化 </strong><br />
这种方式下，与持久化存储的每次交互都发生在一个新的Session中。 然而，同一持久化对象实例可以在多次与数据库的交互中重用。应用程序操纵脱管对象实例 的状态，这个脱管对象实例最初是在另一个Session 中载入的，然后 调用 Session.update()，Session.saveOrUpdate(), 或者 Session.merge() 来重新关联该对象实例。 <br />
<table style="border-top-width: 1px; border-left-width: 1px; border-bottom-width: 1px; border-right-width: 1px" bordercolor="#e0e0e0" cellspacing="1" cellpadding="4" width="95%" align="center" border="1" fixed TABLE-LAYOUT:>
    <tbody>
        <tr>
            <td style="height: 25px; word-wrap: break-word" valign="top" bgcolor="#f6f6f6"><font style="color: #b0b0b0">代码内容</font><br />
            // foo is an instance loaded by a previous Session <br />
            foo.setProperty("bar"); <br />
            session = factory.openSession(); <br />
            Transaction t = session.beginTransaction(); <br />
            session.saveOrUpdate(foo); // Use merge() if "foo" might have been loaded already <br />
            t.commit(); <br />
            session.close(); </td>
        </tr>
    </tbody>
</table>
<br />
Hibernate会再一次在同步的时候检查对象实例的版本，如果发生更新冲突，就抛出异常。 <br />
如果你确信对象没有被修改过，你也可以调用lock() 来设置 LockMode.READ（绕过所有的缓存，执行版本检查），从而取 代 update()操作。 <br />
<br />
<strong>12.3.4.定制自动版本化行为</strong> <br />
对于特定的属性和集合，通过为它们设置映射属性optimistic-lock的值 为false，来禁止Hibernate的版本自动增加。这样的话，如果该属性 脏数据，Hibernate将不再增加版本号。 <br />
遗留系统的数据库Schema通常是静态的，不可修改的。或者，其他应用程序也可能访问同一数据 库，根本无法得知如何处理版本号，甚至时间戳。在以上的所有场景中，实现版本化不能依靠 数据库表的某个特定列。在的映射中设置 optimistic-lock="all"可以在没有版本或者时间戳属性映射的情况下实现 版本检查，此时Hibernate将比较一行记录的每个字段的状态。请注意，只有当Hibernate能够比 较新旧状态的情况下，这种方式才能生效，也就是说， 你必须使用单个长生命周期Session模式，而不能使用 session-per-request-with-detached-objects模式。 <br />
有些情况下，只要更改不发生交错，并发修改也是允许的。当你在 的映射中设置optimistic-lock="dirty"，Hibernate在同步的时候将只比较有脏 数据的字段。 <br />
在以上所有场景中，不管是专门设置一个版本/时间戳列，还是进行全部字段/脏数据字段比较， Hibernate都会针对每个实体对象发送一条UPDATE（带有相应的 WHERE语句 ）的SQL语句来执行版本检查和数据更新。如果你对关联实体 设置级联关系使用传播性持久化（transitive persistence），那么Hibernate可能会执行不必 要的update语句。这通常不是个问题，但是数据库里面对on update点火 的触发器可能在脱管对象没有任何更改的情况下被触发。因此，你可以在 的映射中，通过设置select-before-update="true" 来定制这一行为，强制Hibernate SELECT这个对象实例，从而保证， 在更新记录之前，对象的确是被修改过。 <br />
<br />
<strong>12.4.悲观锁定(Pessimistic Locking)</strong> <br />
用户其实并不需要花很多精力去担心锁定策略的问题。通常情况下，只要为JDBC连接指定一下隔 离级别，然后让数据库去搞定一切就够了。然而，高级用户有时候希望进行一个排它的悲观锁定， 或者在一个新的事务启动的时候，重新进行锁定。 <br />
Hibernate总是使用数据库的锁定机制，从不在内存中锁定对象！ <br />
类LockMode 定义了Hibernate所需的不同的锁定级别。一个锁定 可以通过以下的机制来设置: <br />
当Hibernate更新或者插入一行记录的时候，锁定级别自动设置为LockMode.WRITE。 <br />
当用户显式的使用数据库支持的SQL格式SELECT ... FOR UPDATE 发送SQL的时候，锁定级别设置为LockMode.UPGRADE <br />
当用户显式的使用Oracle数据库的SQL语句SELECT ... FOR UPDATE NOWAIT 的时候，锁定级别设置LockMode.UPGRADE_NOWAIT <br />
当Hibernate在&#8220;可重复读&#8221;或者是&#8220;序列化&#8221;数据库隔离级别下读取数据的时候，锁定模式 自动设置为LockMode.READ。这种模式也可以通过用户显式指定进行设置。 <br />
LockMode.NONE 代表无需锁定。在Transaction结束时， 所有的对象都切换到该模式上来。与session相关联的对象通过调用update() 或者saveOrUpdate()脱离该模式。 <br />
"显式的用户指定"可以通过以下几种方式之一来表示: <br />
调用 Session.load()的时候指定锁定模式(LockMode)。 <br />
调用Session.lock()。 <br />
调用Query.setLockMode()。 <br />
如果在UPGRADE或者UPGRADE_NOWAIT锁定模式下调 用Session.load()，并且要读取的对象尚未被session载入过，那么对象 通过SELECT ... FOR UPDATE这样的SQL语句被载入。如果为一个对象调用 load()方法时，该对象已经在另一个较少限制的锁定模式下被载入了，那 么Hibernate就对该对象调用lock() 方法。 <br />
如果指定的锁定模式是READ, UPGRADE 或 UPGRADE_NOWAIT，那么Session.lock()就 执行版本号检查。（在UPGRADE 或者UPGRADE_NOWAIT 锁定模式下，执行SELECT ... FOR UPDATE这样的SQL语句。） <br />
如果数据库不支持用户设置的锁定模式，Hibernate将使用适当的替代模式（而不是扔出异常）。 这一点可以确保应用程序的可移植性。</font> 
<img src ="http://www.blogjava.net/youngsun/aggbug/207515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-06-12 22:33 <a href="http://www.blogjava.net/youngsun/articles/207515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中的事务控制和并发详解 （3）</title><link>http://www.blogjava.net/youngsun/articles/207511.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Thu, 12 Jun 2008 14:31:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/207511.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/207511.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/207511.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/207511.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/207511.html</trackback:ping><description><![CDATA[<strong>12.2.2.使用JTA</strong> <br />
如果你的持久层运行在一个应用服务器中（例如，在EJB session beans的后面），Hibernate获取 的每个数据源连接将自动成为全局JTA事务的一部分。Hibernate提供了两种策略进行JTA集成。 <br />
如果你使用bean管理事务（BMT），可以通过使用Hibernate的 Transaction API来告诉 应用服务器启动和结束BMT事务。因此，事务管理代码和在非托管环境下是一样的。 <br />
<table style="border-top-width: 1px; border-left-width: 1px; border-bottom-width: 1px; border-right-width: 1px" bordercolor="#e0e0e0" cellspacing="1" cellpadding="4" width="95%" align="center" border="1" fixed TABLE-LAYOUT:>
    <tbody>
        <tr>
            <td style="height: 25px; word-wrap: break-word" valign="top" bgcolor="#f6f6f6"><font style="color: #b0b0b0">代码内容</font><br />
            // BMT idiom <br />
            Session sess = factory.openSession(); <br />
            Transaction tx = null; <br />
            try { <br />
            tx = sess.beginTransaction(); <br />
            <br />
            // do some work <br />
            ... <br />
            <br />
            tx.commit(); <br />
            } <br />
            catch (RuntimeException e) { <br />
            if (tx != null) tx.rollback(); <br />
            throw e; // or display error message <br />
            } <br />
            finally { <br />
            sess.close(); <br />
            } </td>
        </tr>
    </tbody>
</table>
在CMT方式下，事务声明是在session bean的部署描述符中，而不需要编程。 除非你设置了属性hibernate.transaction.flush_before_completion和 hibernate.transaction.auto_close_session为true， 否则你必须自己同步和关闭Session。Hibernate可以为你自动同步和关闭 Session。你唯一要做的就是当发生异常时进行事务回滚。幸运的是， 在一个CMT bean中，事务回滚甚至可以由容器自动进行，因为由session bean方法抛出的未处理的 RuntimeException异常可以通知容器设置全局事务回滚。这意味着 在CMT中，你完全无需使用Hibernate的Transaction API 。 <br />
请注意，当你配置Hibernate事务工厂的时候，在一个BMT session bean中，你应该选择 org.hibernate.transaction.JTATransactionFactory，在一个 CMT session bean中选择org.hibernate.transaction.CMTTransactionFactory。 记住，同时也要设置org.hibernate.transaction.manager_lookup_class。 <br />
如果你使用CMT环境，并且让容器自动同步和关闭session，你可能也希望在你代码的不同部分使用 同一个session。一般来说，在一个非托管环境中，你可以使用一个ThreadLocal 变量来持有这个session，但是单个EJB方法调用可能会在不同的线程中执行（举例来说，一个session bean调用另一个session bean）。如果你不想在应用代码中被传递Session对 象实例的问题困扰的话，那么SessionFactory 提供的 getCurrentSession()方法就很适合你，该方法返回一个绑定到JTA事务 上下文环境中的session实例。这也是把Hibernate集成到一个应用程序中的最简单的方法！这个&#8220;当 前的&#8221;session总是可以自动同步和自动关闭（不考虑上述的属性设置）。我们的session/transaction 管理代码减少到如下所示： <br />
<table style="border-top-width: 1px; border-left-width: 1px; border-bottom-width: 1px; border-right-width: 1px" bordercolor="#e0e0e0" cellspacing="1" cellpadding="4" width="95%" align="center" border="1" fixed TABLE-LAYOUT:>
    <tbody>
        <tr>
            <td style="height: 25px; word-wrap: break-word" valign="top" bgcolor="#f6f6f6"><font style="color: #b0b0b0">代码内容</font><br />
            // CMT idiom <br />
            Session sess = factory.getCurrentSession(); <br />
            <br />
            // do some work <br />
            ... </td>
        </tr>
    </tbody>
</table>
<br />
换句话来说，在一个托管环境下，你要做的所有的事情就是调用 SessionFactory.getCurrentSession()，然后进行你的数据访问，把其余的工作 交给容器来做。事务在你的session bean的部署描述符中以可声明的方式来设置。session的生命周期完全 由Hibernate来管理。 <br />
对after_statement连接释放方式有一个警告。因为JTA规范的一个很愚蠢的限制，Hibernate不可能自动清理任何未关闭的ScrollableResults 或者Iterator，它们是由scroll()或iterate()产生的。你must通过在finally块中，显式调用ScrollableResults.close()或者Hibernate.close(Iterator)方法来释放底层数据库游标。(当然，大部分程序完全可以很容易的避免在CMT代码中出现scroll()或iterate()。) <br />
<br />
<strong>12.2.3.异常处理</strong> <br />
如果 Session 抛出异常 (包括任何SQLException), 你应该立即回滚数据库事务，调用 Session.close() ，丢弃该 Session实例。Session的某些方法可能会导致session 处于不一致的状态。所有由Hibernate抛出的异常都视为不可以恢复的。确保在 finally 代码块中调用close()方法，以关闭掉 Session。 <br />
HibernateException是一个非检查期异常（这不同于Hibernate老的版本）， 它封装了Hibernate持久层可能出现的大多数错误。我们的观点是，不应该强迫应用程序开发人员 在底层捕获无法恢复的异常。在大多数软件系统中，非检查期异常和致命异常都是在相应方法调用 的堆栈的顶层被处理的（也就是说，在软件上面的逻辑层），并且提供一个错误信息给应用软件的用户 （或者采取其他某些相应的操作）。请注意，Hibernate也有可能抛出其他并不属于 HibernateException的非检查期异常。这些异常同样也是无法恢复的，应该 采取某些相应的操作去处理。 <br />
在和数据库进行交互时，Hibernate把捕获的SQLException封装为Hibernate的 JDBCException。事实上，Hibernate尝试把异常转换为更有实际含义 的JDBCException异常的子类。底层的SQLException可以 通过JDBCException.getCause()来得到。Hibernate通过使用关联到 SessionFactory上的SQLExceptionConverter来 把SQLException转换为一个对应的JDBCException 异常的子类。默认情况下，SQLExceptionConverter可以通过配置dialect 选项指定；此外，也可以使用用户自定义的实现类（参考javadocs SQLExceptionConverterFactory类来了解详情）。标准的 JDBCException子类型是： <br />
JDBCConnectionException - 指明底层的JDBC通讯出现错误 <br />
SQLGrammarException - 指明发送的SQL语句的语法或者格式错误 <br />
ConstraintViolationException - 指明某种类型的约束违例错误 <br />
LockAcquisitionException - 指明了在执行请求操作时，获取 所需的锁级别时出现的错误。 <br />
GenericJDBCException - 不属于任何其他种类的原生异常 <br />
<br />
<strong>12.3.乐观并发控制(Optimistic concurrency control)</strong> <br />
唯一能够同时保持高并发和高可伸缩性的方法就是使用带版本化的乐观并发控制。版本检查使用版本号、 或者时间戳来检测更新冲突（并且防止更新丢失）。Hibernate为使用乐观并发控制的代码提供了三种可 能的方法，应用程序在编写这些代码时，可以采用它们。我们已经在前面应用程序长事务那部分展示了 乐观并发控制的应用场景，此外，在单个数据库事务范围内，版本检查也提供了防止更新丢失的好处。 <br />
12.3.1.应用程序级别的版本检查(Application version checking) <br />
未能充分利用Hibernate功能的实现代码中，每次和数据库交互都需要一个新的 Session，而且开发人员必须在显示数据之前从数据库中重 新载入所有的持久化对象实例。这种方式迫使应用程序自己实现版本检查来确保 应用程序事务的隔离，从数据访问的角度来说是最低效的。这种使用方式和 entity EJB最相似。 <br />
// foo is an instance loaded by a previous Session <br />
session = factory.openSession(); <br />
Transaction t = session.beginTransaction(); <br />
int oldVersion = foo.getVersion(); <br />
session.load( foo, foo.getKey() ); // load the current state <br />
if ( oldVersion!=foo.getVersion ) throw new StaleObjectStateException(); <br />
foo.setProperty("bar"); <br />
t.commit(); <br />
session.close(); <br />
version 属性使用 来映射，如果对象 是脏数据，在同步的时候，Hibernate会自动增加版本号。 <br />
当然，如果你的应用是在一个低数据并发环境下，并不需要版本检查的话，你照样可以使用 这种方式，只不过跳过版本检查就是了。在这种情况下，最晚提交生效 （last commit wins）就是你的应用程序长事务的默认处理策略。 请记住这种策略可能会让应用软件的用户感到困惑，因为他们有可能会碰上更新丢失掉却没 有出错信息，或者需要合并更改冲突的情况。 <br />
很明显，手工进行版本检查只适合于某些软件规模非常小的应用场景，对于大多数软件应用场景 来说并不现实。通常情况下，不仅是单个对象实例需要进行版本检查，整个被修改过的关 联对象图也都需要进行版本检查。作为标准设计范例，Hibernate使用长生命周期 Session的方式，或者脱管对象实例的方式来提供自动版本检查。 <br />
<br />
<strong>12.3.2.长生命周期session和自动版本化 </strong><br />
单个 Session实例和它所关联的所有持久化对象实例都被用于整个 应用程序事务。Hibernate在同步的时候进行对象实例的版本检查，如果检测到并发修 改则抛出异常。由开发人员来决定是否需要捕获和处理这个异常（通常的抉择是给用户 提供一个合并更改，或者在无脏数据情况下重新进行业务操作的机会）。 <br />
在等待用户交互的时候， Session 断开底层的JDBC连接。这种方式 以数据库访问的角度来说是最高效的方式。应用程序不需要关心版本检查或脱管对象实例 的重新关联，在每个数据库事务中，应用程序也不需要载入读取对象实例。 <br />
<table style="border-top-width: 1px; border-left-width: 1px; border-bottom-width: 1px; border-right-width: 1px" bordercolor="#e0e0e0" cellspacing="1" cellpadding="4" width="95%" align="center" border="1" fixed TABLE-LAYOUT:>
    <tbody>
        <tr>
            <td style="height: 25px; word-wrap: break-word" valign="top" bgcolor="#f6f6f6"><font style="color: #b0b0b0">代码内容</font><br />
            // foo is an instance loaded earlier by the Session <br />
            session.reconnect(); // Obtain a new JDBC connection <br />
            Transaction t = session.beginTransaction(); <br />
            foo.setProperty("bar"); <br />
            t.commit(); // End database transaction, flushing the change and checking the version <br />
            session.disconnect(); // Return JDBC connection </td>
        </tr>
    </tbody>
</table>
<br />
foo 对象始终和载入它的Session相关联。 Session.reconnect()获取一个新的数据库连接（或者 你可以提供一个），并且继续当前的session。Session.disconnect() 方法把session与JDBC连接断开，把数据库连接返回到连接池（除非是你自己提供的数据 库连接）。在Session重新连接上数据库连接之后，你可以对任何可能被其他事务更新过 的对象调用Session.lock()，设置LockMode.READ 锁定模式，这样你就可以对那些你不准备更新的数据进行强制版本检查。此外，你并不需要 锁定那些你准备更新的数据。 <br />
假若对disconnect()和reconnect()的显式调用发生得太频繁了，你可以使用hibernate.connection.release_mode来代替。 <br />
如果在用户思考的过程中，Session因为太大了而不能保存，那么这种模式是有 问题的。举例来说，一个HttpSession应该尽可能的小。由于 Session是一级缓存，并且保持了所有被载入过的对象，因此 我们只应该在那些少量的request/response情况下使用这种策略。而且在这种情况下， Session 里面很快就会有脏数据出现，因此请牢牢记住这一建议。 <br />
此外，也请注意，你应该让与数据库连接断开的Session对持久层保持 关闭状态。换句话说，使用有状态的EJB session bean来持有Session， 而不要把它传递到web层（甚至把它序列化到一个单独的层），保存在HttpSession中。 
<img src ="http://www.blogjava.net/youngsun/aggbug/207511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-06-12 22:31 <a href="http://www.blogjava.net/youngsun/articles/207511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中的事务控制和并发详解 （2）</title><link>http://www.blogjava.net/youngsun/articles/207510.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Thu, 12 Jun 2008 14:29:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/207510.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/207510.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/207510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/207510.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/207510.html</trackback:ping><description><![CDATA[<strong>12.1.3.关注对象标识(Considering object identity)</strong> <br />
应用程序可能在两个不同的Session中并发访问同一持久化状态，但是， 一个持久化类的实例无法在两个 Session中共享。因此有两种不同的标识语义： <br />
数据库标识 <br />
foo.getId().equals( bar.getId() ) <br />
JVM 标识 <br />
foo==bar <br />
对于那些关联到 特定Session （也就是在单个Session的范围内）上的对象来说，这 两种标识的语义是等价的，与数据库标识对应的JVM标识是由Hibernate来保 证的。不过，当应用程序在两个不同的session中并发访问具有同一持久化标 识的业务对象实例的时候，这个业务对象的两个实例事实上是不相同的（从 JVM识别来看）。这种冲突可以通过在同步和提交的时候使用自动版本化和乐 观锁定方法来解决。 <br />
这种方式把关于并发的头疼问题留给了Hibernate和数据库；由于在单个线程内，操作单元中的对象识别不 需要代价昂贵的锁定或其他意义上的同步，因此它同时可以提供最好的可伸缩性。只要在单个线程只持有一个 Session，应用程序就不需要同步任何业务对象。在Session 的范围内，应用程序可以放心的使用==进行对象比较。 <br />
不过，应用程序在Session的外面使用==进行对象比较可能会 导致无法预期的结果。在一些无法预料的场合，例如，如果你把两个脱管对象实例放进同一个 Set的时候，就可能发生。这两个对象实例可能有同一个数据库标识（也就是说， 他们代表了表的同一行数据），从JVM标识的定义上来说，对脱管的对象而言，Hibernate无法保证他们 的的JVM标识一致。开发人员必须覆盖持久化类的equals()方法和 hashCode() 方法，从而实现自定义的对象相等语义。警告：不要使用数据库标识 来实现对象相等，应该使用业务键值，由唯一的，通常不变的属性组成。当一个瞬时对象被持久化的时 候，它的数据库标识会发生改变。如果一个瞬时对象（通常也包括脱管对象实例）被放入一 个Set，改变它的hashcode会导致与这个Set的关系中断。虽 然业务键值的属性不象数据库主键那样稳定不变，但是你只需要保证在同一个Set 中的对象属性的稳定性就足够了。请到Hibernate网站去寻求这个问题更多的详细的讨论。请注意，这不是一 个有关Hibernate的问题，而仅仅是一个关于Java对象标识和判等行为如何实现的问题。 <br />
<br />
<strong>12.1.4.常见问题</strong> <br />
决不要使用反模式session-per-user-session或者 session-per-application（当然，这个规定几乎没有例外）。请注意， 下述一些问题可能也会出现在我们推荐的模式中，在你作出某个设计决定之前，请务必理解该模式的应用前提。 <br />
Session 是一个非线程安全的类。如果一个Session 实例允许共享的话，那些支持并发运行的东东，例如HTTP request，session beans,或者是 Swing workers，将会导致出现资源争用（race condition）。如果在HttpSession中有 Hibernate 的Session的话（稍后讨论），你应该考虑同步访问你的Http session。 否则，只要用户足够快的点击浏览器的&#8220;刷新&#8221;，就会导致两个并发运行线程使用同一个 Session。 <br />
一个由Hibernate抛出的异常意味着你必须立即回滚数据库事务，并立即关闭Session （稍后会展开讨论）。如果你的Session绑定到一个应用程序上，你必 须停止该应用程序。回滚数据库事务并不会把你的业务对象退回到事务启动时候的状态。这 意味着数据库状态和业务对象状态不同步。通常情况下，这不是什么问题，因为异常是不可 恢复的,你必须在回滚之后重新开始执行。 <br />
Session 缓存了处于持久化状态的每个对象（Hibernate会监视和检查脏数据）。 这意味着，如果你让Session打开很长一段时间，或是仅仅载入了过多的数据， Session占用的内存会一直增长，直到抛出OutOfMemoryException异常。这个 问题的一个解决方法是调用clear() 和evict()来管理 Session的缓存，但是如果你需要大批量数据操作的话，最好考虑 使用存储过程。在第14章 批量处理（Batch processing）中有一些解决方案。在用户会话期间一直保持 Session打开也意味着出现脏数据的可能性很高。 <br />
<br />
<strong>12.2.数据库事务声明</strong> <br />
数据库（或者系统）事务的声明总是必须的。在数据库事务之外，就无法和数据库通讯（这可能会让那些习惯于 自动提交事务模式的开发人员感到迷惑）。永远使用清晰的事务声明，即使只读操作也是如此。进行 显式的事务声明并不总是需要的，这取决于你的事务隔离级别和数据库的能力，但不管怎么说，声明事务总归有益无害。 <br />
一个Hibernate应用程序可以运行在非托管环境中（也就是独立运行的应用程序，简单Web应用程序， 或者Swing图形桌面应用程序），也可以运行在托管的J2EE环境中。在一个非托管环境中，Hibernate 通常自己负责管理数据库连接池。应用程序开发人员必须手工设置事务声明，换句话说，就是手工启 动，提交，或者回滚数据库事务。一个托管的环境通常提供了容器管理事务，例如事务装配通过可声 明的方式定义在EJB session beans的部署描述符中。可编程式事务声明不再需要，即使是 Session 的同步也可以自动完成。 <br />
让持久层具备可移植性是人们的理想。Hibernate提供了一套称为Transaction的封装API， 用来把你的部署环境中的本地事务管理系统转换到Hibernate事务上。这个API是可选的，但是我们强烈 推荐你使用，除非你用CMT session bean。 <br />
通常情况下，结束 Session 包含了四个不同的阶段: <br />
同步session(flush,刷出到磁盘） <br />
提交事务 <br />
关闭session <br />
处理异常 <br />
session的同步(flush,刷出）前面已经讨论过了，我们现在进一步考察在托管和非托管环境下的事务声明和异常处理。 <br />
<br />
<strong>12.2.1.非托管环境</strong> <br />
如果Hibernat持久层运行在一个非托管环境中，数据库连接通常由Hibernate的连接池机制 来处理。 <br />
<table style="border-top-width: 1px; border-left-width: 1px; border-bottom-width: 1px; border-right-width: 1px" bordercolor="#e0e0e0" cellspacing="1" cellpadding="4" width="95%" align="center" border="1" fixed TABLE-LAYOUT:>
    <tbody>
        <tr>
            <td style="height: 25px; word-wrap: break-word" valign="top" bgcolor="#f6f6f6"><font style="color: #b0b0b0">代码内容</font><br />
            session/transaction处理方式如下所示： <br />
            //Non-managed environment idiom <br />
            Session sess = factory.openSession(); <br />
            Transaction tx = null; <br />
            try { <br />
            tx = sess.beginTransaction(); <br />
            <br />
            // do some work <br />
            ... <br />
            <br />
            tx.commit(); <br />
            } <br />
            catch (RuntimeException e) { <br />
            if (tx != null) tx.rollback(); <br />
            throw e; // or display error message <br />
            } <br />
            finally { <br />
            sess.close(); <br />
            } </td>
        </tr>
    </tbody>
</table>
<br />
你不需要显式flush() Session - 对commit()的调用会自动触发session的同步。 <br />
调用 close() 标志session的结束。 close()方法重要的暗示是，session释放了JDBC连接。 <br />
这段Java代码是可移植的，可以在非托管环境和JTA环境中运行。 <br />
你很可能从未在一个标准的应用程序的业务代码中见过这样的用法；致命的（系统）异常应该总是 在应用程序&#8220;顶层&#8221;被捕获。换句话说，执行Hibernate调用的代码（在持久层）和处理 RuntimeException异常的代码（通常只能清理和退出应用程序）应该在不同 的应用程序逻辑层。这对于你设计自己的软件系统来说是一个挑战，只要有可能，你就应该使用 J2EE/EJB容器服务。异常处理将在本章稍后进行讨论。 <br />
请注意，你应该选择 org.hibernate.transaction.JDBCTransactionFactory (这是默认选项). 
<img src ="http://www.blogjava.net/youngsun/aggbug/207510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-06-12 22:29 <a href="http://www.blogjava.net/youngsun/articles/207510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中的事务控制和并发详解 （1）</title><link>http://www.blogjava.net/youngsun/articles/207483.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Thu, 12 Jun 2008 12:29:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/207483.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/207483.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/207483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/207483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/207483.html</trackback:ping><description><![CDATA[<span class="a14c" id="zoom">
<p style="text-indent: 2em"><font id="zoom">Hibernate的事务和并发控制很容易掌握。Hibernate直接使用JDBC连接和JTA资源，不添加任何附加锁定 行为。我们强烈推荐你花点时间了解JDBC编程，ANSI SQL查询语言和你使用 的数据库系统的事务隔离规范。Hibernate只添加自动版本管理，而不会锁 定内存中的对象，也不会改变数据库事务的隔离级别。基本上，使用 Hibernate就好像直接使用JDBC(或者JTA/CMT)来访问你的数据库资源。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;除了自动版本管理，针对行级悲观锁定，Hibernate也提供了辅助的API，它使用了 SELECT FOR UPDATE的SQL语法。本章后面会讨论这个API。我们从Configuration层、SessionFactory层, 和 Session层开始讨论Hibernate的并行控制、数据库事务和应用 程序的长事务。 <br />
<br />
<strong>12.1.Session和事务范围(transaction scopes)</strong> <br />
一个SessionFactory对象的创建代价很昂贵，它是线程安全的对象，它被设计成可以 为所有的应用程序线程所共享。它只创建一次，通常是在应用程序启动的时候，由一个 Configuraion的实例来创建。 <br />
一个Session的对象是轻型的，非线程安全的，对于单个业务进程，单个的 工作单元而言，它只被使用一次，然后就丢弃。只有在需要的时候，Session 才会获取一个JDBC的Connection（或一个Datasource） 对象。所以你可以放心的打开和关闭Session，甚至当你并不确定一个特定的请 求是否需要数据访问时，你也可以这样做。(一旦你实现下面提到的使用了请求拦截的模式，这就 变得很重要了。 <br />
此外我们还要考虑数据库事务。数据库事务应该尽可能的短，降低数据库锁定造成的资源争用。 数据库长事务会导致你的应用程序无法扩展到高的并发负载。 <br />
一个操作单元(Unit of work)的范围是多大？单个的Hibernate Session能跨越多个 数据库事务吗？还是一个Session的作用范围对应一个数据库事务的范围？应该何时打开 Session，何时关闭Session？，你又如何划分数据库事务的边界呢？ <br />
<br />
<strong>12.1.1.操作单元(Unit of work)</strong> <br />
首先，别再用session-per-operation这种反模式了，也就是说，在单个线程中， 不要因为一次简单的数据库调用，就打开和关闭一次Session！数据库事务也是如此。 应用程序中的数据库调用是按照计划好的次序，分组为原子的操作单元。（注意，这也意味着，应用程 序中，在单个的SQL语句发送之后，自动事务提交(auto-commit)模式失效了。这种模式专门为SQL控制台操作设计的。 Hibernate禁止立即自动事务提交模式，或者期望应用服务器禁止立即自动事务提交模式。） <br />
在多用户的client/server应用程序中，最常用的模式是 每个请求一个会话(session-per-request)。 在这种模式下，来自客户端的请求被发送到服务器端（即Hibernate持久化层运行的地方），一 个新的Hibernate Session被打开，并且执行这个操作单元中所有的数据库操作。 一旦操作完成（同时发送到客户端的响应也准备就绪），session被同步，然后关闭。你也可以使用单 个数据库事务来处理客户端请求，在你打开Session之后启动事务，在你关闭 Session之前提交事务。会话和请求之间的关系是一对一的关系，这种模式对 于大多数应用程序来说是很棒的。 <br />
真正的挑战在于如何去实现这种模式：不仅Session和事务必须被正确的开始和结束， 而且他们也必须能被数据访问操作访问。用拦截器来实现操作单元的划分，该拦截器在客户端请求达到服 务器端的时候开始，在服务器端发送响应（即，ServletFilter）之前结束。我们推荐 使用一个ThreadLocal 变量，把 Session绑定到处理客户端请求的线 程上去。这种方式可以让运行在该线程上的所有程序代码轻松的访问Session（就像访问一 个静态变量那样）。你也可以在一个ThreadLocal 变量中保持事务上下文环境，不过这依赖 于你所选择的数据库事务划分机制。这种实现模式被称之为 ThreadLocal Session和 Open Session in View。你可以很容易的扩展本文前面章节展示的 HibernateUtil 辅助类来实现这种模式。当然，你必须找到一种实现拦截器的方法，并 且可以把拦截器集成到你的应用环境中。请参考Hibernate网站上面的提示和例子。 <br />
<br />
<strong>12.1.2.应用程序事务(Application transactions)</strong> <br />
session-per-request模式不仅仅是一个可以用来设计操作单元的有用概念。很多业务处理流程都需 要一系列完整的和用户之间的交互，即用户对数据库的交叉访问。在基于web的应用和企业 应用中，跨用户交互的数据库事务是无法接受的。考虑下面的例子： <br />
在界面的第一屏，打开对话框，用户所看到的数据是被一个特定的 Session 和数据 库事务载入(load)的。用户可以随意修改对话框中的数据对象。 <br />
5分钟后，用户点击&#8220;保存&#8221;，期望所做出的修改被持久化；同时他也期望自己是唯一修改这个信息的人，不会出现 修改冲突。 <br />
从用户的角度来看，我们把这个操作单元称为应用程序长事务（application transaction）。 在你的应用程序中，可以有很多种方法来实现它。 <br />
头一个幼稚的做法是，在用户思考的过程中，保持Session和数据库事务是打开的， 保持数据库锁定，以阻止并发修改，从而保证数据库事务隔离级别和原子操作。这种方式当然是一个反模式， 因为数据库锁定的维持会导致应用程序无法扩展并发用户的数目。 <br />
很明显，我们必须使用多个数据库事务来实现一个应用程序事务。在这个例子中，维护业务处理流程的 事务隔离变成了应用程序层的部分责任。单个应用程序事务通常跨越多个数据库事务。如果仅仅只有一 个数据库事务（最后的那个事务）保存更新过的数据，而所有其他事务只是单纯的读取数据（例如在一 个跨越多个请求/响应周期的向导风格的对话框中），那么应用程序事务将保证其原子性。这种方式比听 起来还要容易实现，特别是当你使用了Hibernate的下述特性的时候： <br />
自动版本化 - Hibernate能够自动进行乐观并发控制 ，如果在用户思考 的过程中发生并发修改冲突，Hibernate能够自动检测到。 <br />
脱管对象（Detached Objects）- 如果你决定采用前面已经讨论过的 session-per-request模式，所有载入的实例在用户思考的过程 中都处于与Session脱离的状态。Hibernate允许你把与Session脱离的对象重新关联到Session 上，并且对修改进行持久化，这种模式被称为 session-per-request-with-detached-objects。自动版本化被用来隔离并发修改。 <br />
长生命周期的Session （Long Session）- Hibernate 的Session 可以在数据库事务提交之后和底层的JDBC连接断开，当一个新的客户端请求到来的时候，它又重新连接上底层的 JDBC连接。这种模式被称之为session-per-application-transaction，这种情况可 能会造成不必要的Session和JDBC连接的重新关联。自动版本化被用来隔离并发修改。 <br />
session-per-request-with-detached-objects 和 session-per-application-transaction 各有优缺点，我们在本章后面乐观并发 控制那部分再进行讨论。</font></span> </p>
 <img src ="http://www.blogjava.net/youngsun/aggbug/207483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-06-12 20:29 <a href="http://www.blogjava.net/youngsun/articles/207483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate3的配置参数汇总</title><link>http://www.blogjava.net/youngsun/articles/207480.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Thu, 12 Jun 2008 12:02:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/207480.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/207480.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/207480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/207480.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/207480.html</trackback:ping><description><![CDATA[<strong _fckxhtmljob="7">1、Hibernate JDBC属性</strong>
<table summary="                Hibernate JDBC属性&#13;&#10;    " border="1">
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal">hibernate.connection.driver_class</tt> </td>
            <td><span class="emphasis">jdbc驱动类 </span></td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.connection.url</tt> </td>
            <td><span class="emphasis">jdbc URL </span></td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.connection.username</tt> </td>
            <td><span class="emphasis">数据库用户 </span></td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.connection.password</tt> </td>
            <td><span class="emphasis">数据库用户密码 </span></td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.connection.pool_size</tt> </td>
            <td><span class="emphasis">连接池容量上限数目 </span></td>
        </tr>
    </tbody>
</table>
注：使用C3P0的properties样例代码：
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,0)">hibernate.connection.driver_class&nbsp;=&nbsp;org.postgresql.Driver hibernate.connection.url&nbsp;=&nbsp;jdbc:postgresql://localhost/mydatabase hibernate.connection.username&nbsp;=&nbsp;myuser hibernate.connection.password&nbsp;=&nbsp;secret hibernate.c3p0.min_size=5 hibernate.c3p0.max_size=20 hibernate.c3p0.timeout=1800 hibernate.c3p0.max_statements=50 hibernate.dialect&nbsp;=&nbsp;org.hibernate.dialect.PostgreSQLDialect</span></div>
<strong>2、Hibernate的数据源属性</strong>
<table height="182" width="544" summary="                Hibernate数据源属性&#13;&#10;    " border="1">
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal">hibernate.connection.datasource</tt></td>
            <td><span class="emphasis">数据源JNDI名字</span></td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.jndi.url</tt></td>
            <td><span class="emphasis">JNDI提供者的URL</span> (可选) </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.jndi.class</tt></td>
            <td><span class="emphasis">JNDI <tt class="literal">InitialContextFactory</tt>类</span> (可选) </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.connection.username</tt></td>
            <td><span class="emphasis">数据库用户</span> (可选) </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.connection.password</tt></td>
            <td><span class="emphasis">数据库用户密码</span> (可选)</td>
        </tr>
    </tbody>
</table>
注：应用程序服务器JNDI数据源的<tt class="literal">hibernate.properties</tt>样例代码：
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,0)">hibernate.connection.datasource&nbsp;=&nbsp;java:/comp/env/jdbc/test hibernate.transaction.factory_class&nbsp;=&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.transaction.JTATransactionFactory hibernate.transaction.manager_lookup_class&nbsp;=&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.transaction.JBossTransactionManagerLookup hibernate.dialect&nbsp;=&nbsp;org.hibernate.dialect.PostgreSQLDialect</span></div>
3、<strong>Hibernate配置属性（可选）</strong>
<table height="870" width="745" summary="                Hibernate配置属性&#13;&#10;    " border="1">
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal">hibernate.dialect</tt></td>
            <td>一个Hibernate <tt class="literal">Dialect</tt>类名允许Hibernate针对特定的关系数据库生成优化的SQL.
            <p><span class="strong">取值</span><tt class="literal">full.classname.of.Dialect</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.show_sql</tt></td>
            <td>输出所有SQL语句到控制台.
            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.format_sql</tt></td>
            <td>在log和console中打印出更漂亮的sql.
            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.default_schema</tt></td>
            <td>在生成的SQL中, 将给定的schema/tablespace附加于非全限定名的表名上.
            <p><span class="strong">取值</span><tt class="literal">SCHEMA_NAME</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.default_catalog</tt></td>
            <td>在生成的SQL中, 将给定的catalog附加于没全限定名的表名上.
            <p><span class="strong">取值</span><tt class="literal">CATALOG_NAME</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.session_factory_name</tt></td>
            <td><tt class="literal">SessionFactory</tt>创建后，将自动使用这个名字绑定到JNDI中.
            <p><span class="strong">取值</span><tt class="literal">jndi/composite/name</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.max_fetch_depth</tt></td>
            <td>为单向关联(一对一, 多对一)的外连接抓取（outer join fetch）树设置最大深度. 值为<tt class="literal">0</tt>意味着将关闭默认的外连接抓取.
            <p><span class="strong">取值</span> 建议在<tt class="literal">0</tt>到<tt class="literal">3</tt>之间取值 </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.default_batch_fetch_size</tt></td>
            <td>为Hibernate关联的批量抓取设置默认数量.
            <p><span class="strong">取值</span> 建议的取值为<tt class="literal">4</tt>, <tt class="literal">8</tt>, 和<tt class="literal">16</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.default_entity_mode</tt></td>
            <td>为由这个<tt class="literal">SessionFactory</tt>打开的所有Session指定默认的实体表现模式.
            <p><span class="strong">取值</span><tt class="literal">dynamic-map</tt>, <tt class="literal">dom4j</tt>, <tt class="literal">pojo</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.order_updates</tt></td>
            <td>强制Hibernate按照被更新数据的主键，为SQL更新排序。这么做将减少在高并发系统中事务的死锁。
            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.generate_statistics</tt></td>
            <td>如果开启, Hibernate将收集有助于性能调节的统计数据.
            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.use_identifer_rollback</tt></td>
            <td>如果开启, 在对象被删除时生成的标识属性将被重设为默认值.
            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.use_sql_comments</tt></td>
            <td>如果开启, Hibernate将在SQL中生成有助于调试的注释信息, 默认值为<tt class="literal">false</tt>.
            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p>
            </td>
        </tr>
    </tbody>
</table>
4、<strong>Hibernate JDBC和连接(connection)属性 </strong>
<table summary="                Hibernate JDBC和连接(connection)属性&#13;&#10;    " border="1">
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal">hibernate.jdbc.fetch_size</tt></td>
            <td>非零值，指定JDBC抓取数量的大小 (调用<tt class="literal">Statement.setFetchSize()</tt>). </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.jdbc.batch_size</tt></td>
            <td>非零值，允许Hibernate使用JDBC2的批量更新.
            <p><span class="strong">取值</span> 建议取<tt class="literal">5</tt>到<tt class="literal">30</tt>之间的值 </p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.jdbc.batch_versioned_data</tt></td>
            <td>如果你想让你的JDBC驱动从<tt class="literal">executeBatch()</tt>返回正确的行计数 , 那么将此属性设为<tt class="literal">true</tt>(开启这个选项通常是安全的). 同时，Hibernate将为自动版本化的数据使用批量DML. 默认值为<tt class="literal">false</tt>.
            <p><span class="strong">eg.</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.jdbc.factory_class</tt></td>
            <td>选择一个自定义的<tt class="literal">Batcher</tt>. 多数应用程序不需要这个配置属性.
            <p><span class="strong">eg.</span><tt class="literal">classname.of.Batcher</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.jdbc.use_scrollable_resultset</tt></td>
            <td>允许Hibernate使用JDBC2的可滚动结果集. 只有在使用用户提供的JDBC连接时，这个选项才是必要的, 否则Hibernate会使用连接的元数据.
            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.jdbc.use_streams_for_binary</tt></td>
            <td>在JDBC读写<tt class="literal">binary (二进制)</tt>或<tt class="literal">serializable (可序列化)</tt> 的类型时使用流(stream)(系统级属性).
            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.jdbc.use_get_generated_keys</tt></td>
            <td>在数据插入数据库之后，允许使用JDBC3 <tt class="literal">PreparedStatement.getGeneratedKeys()</tt> 来获取数据库生成的key(键)。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器时遇到问题，请将此值设为false. 默认情况下将使用连接的元数据来判定驱动的能力.
            <p><span class="strong">取值</span><tt class="literal">true|false</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.connection.provider_class</tt></td>
            <td>自定义<tt class="literal">ConnectionProvider</tt>的类名, 此类用来向Hibernate提供JDBC连接.
            <p><span class="strong">取值</span><tt class="literal">classname.of.ConnectionProvider</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.connection.isolation</tt></td>
            <td>设置JDBC事务隔离级别. 查看<tt class="literal">java.sql.Connection</tt>来了解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离级别.
            <p><span class="strong">取值</span><tt class="literal">1, 2, 4, 8</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.connection.autocommit</tt></td>
            <td>允许被缓存的JDBC连接开启自动提交(autocommit) (不建议).
            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.connection.release_mode</tt></td>
            <td>指定Hibernate在何时释放JDBC连接. 默认情况下,直到Session被显式关闭或被断开连接时,才会释放JDBC连接. 对于应用程序服务器的JTA数据源, 你应当使用<tt class="literal">after_statement</tt>, 这样在每次JDBC调用后，都会主动的释放连接. 对于非JTA的连接, 使用<tt class="literal">after_transaction</tt>在每个事务结束时释放连接是合理的. <tt class="literal">auto</tt>将为JTA和CMT事务策略选择<tt class="literal">after_statement</tt>, 为JDBC事务策略选择<tt class="literal">after_transaction</tt>.
            <p><span class="strong">取值</span><tt class="literal">on_close</tt> | <tt class="literal">after_transaction</tt> | <tt class="literal">after_statement</tt> | <tt class="literal">auto</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.connection.<span class="emphasis">&lt;propertyName&gt;</span></tt></td>
            <td>将JDBC属性<tt class="literal">propertyName</tt>传递到<tt class="literal">DriverManager.getConnection()</tt>中去. </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.jndi.<span class="emphasis">&lt;propertyName&gt;</span></tt></td>
            <td>将属性<tt class="literal">propertyName</tt>传递到JNDI <tt class="literal">InitialContextFactory</tt>中去.</td>
        </tr>
    </tbody>
</table>
<strong>5、Hibernate缓存属性 </strong>
<table summary="                Hibernate缓存属性&#13;&#10;    " border="1">
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal">hibernate.cache.provider_class</tt></td>
            <td>自定义的<tt class="literal">CacheProvider</tt>的类名.
            <p><span class="strong">取值</span><tt class="literal">classname.of.CacheProvider</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.cache.use_minimal_puts</tt></td>
            <td>以频繁的读操作为代价, 优化二级缓存来最小化写操作. 在Hibernate3中，这个设置对的集群缓存非常有用, 对集群缓存的实现而言，默认是开启的.
            <p><span class="strong">取值</span><tt class="literal">true|false</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.cache.use_query_cache</tt></td>
            <td>允许查询缓存, 个别查询仍然需要被设置为可缓存的.
            <p><span class="strong">取值</span><tt class="literal">true|false</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.cache.use_second_level_cache</tt></td>
            <td>能用来完全禁止使用二级缓存. 对那些在类的映射定义中指定<tt class="literal">&lt;cache&gt;</tt>的类，会默认开启二级缓存.
            <p><span class="strong">取值</span><tt class="literal">true|false</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.cache.query_cache_factory</tt></td>
            <td>自定义的实现<tt class="literal">QueryCache</tt>接口的类名, 默认为内建的<tt class="literal">StandardQueryCache</tt>.
            <p><span class="strong">取值</span><tt class="literal">classname.of.QueryCache</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.cache.region_prefix</tt></td>
            <td>二级缓存区域名的前缀.
            <p><span class="strong">取值</span><tt class="literal">prefix</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.cache.use_structured_entries</tt></td>
            <td>强制Hibernate以更人性化的格式将数据存入二级缓存.
            <p><span class="strong">取值</span><tt class="literal">true|false</tt></p>
            </td>
        </tr>
    </tbody>
</table>
6、<strong>Hibernate事务属性 </strong>
<table summary="                Hibernate事务属性&#13;&#10;    " border="1">
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal">hibernate.transaction.factory_class</tt></td>
            <td>一个<tt class="literal">TransactionFactory</tt>的类名, 用于Hibernate <tt class="literal">Transaction</tt> API (默认为<tt class="literal">JDBCTransactionFactory</tt>).
            <p><span class="strong">取值</span><tt class="literal">classname.of.TransactionFactory</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">jta.UserTransaction</tt></td>
            <td>一个JNDI名字，被<tt class="literal">JTATransactionFactory</tt>用来从应用服务器获取JTA <tt class="literal">UserTransaction</tt>.
            <p><span class="strong">取值</span><tt class="literal">jndi/composite/name</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.transaction.manager_lookup_class</tt></td>
            <td>一个<tt class="literal">TransactionManagerLookup</tt>的类名 - 当使用JVM级缓存，或在JTA环境中使用hilo生成器的时候需要该类.
            <p><span class="strong">取值</span><tt class="literal">classname.of.TransactionManagerLookup</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.transaction.flush_before_completion</tt></td>
            <td>如果开启, session在事务完成后将被自动清洗(flush). (在Hibernate和CMT一起使用时很有用.)
            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.transaction.auto_close_session</tt></td>
            <td>如果开启, session在事务完成前将被自动关闭. (在Hibernate和CMT一起使用时很有用.)
            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p>
            </td>
        </tr>
    </tbody>
</table>
7、<strong>其他属性 </strong>
<table summary="                其他属性&#13;&#10;    " border="1">
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal">hibernate.query.factory_class</tt></td>
            <td>选择HQL解析器的实现.
            <p><span class="strong">取值</span><tt class="literal">org.hibernate.hql.ast.ASTQueryTranslatorFactory</tt> or <tt class="literal">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.query.substitutions</tt></td>
            <td>将Hibernate查询中的符号映射到SQL查询中的符号 (符号可能是函数名或常量名字).
            <p><span class="strong">取值</span><tt class="literal">hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.hbm2ddl.auto</tt></td>
            <td>在<tt class="literal">SessionFactory</tt>创建时，自动将数据库schema的DDL导出到数据库. 使用 <tt class="literal">create-drop</tt>时,在显式关闭<tt class="literal">SessionFactory</tt>时，将drop掉数据库schema.
            <p><span class="strong">取值</span><tt class="literal">update</tt> | <tt class="literal">create</tt> | <tt class="literal">create-drop</tt></p>
            </td>
        </tr>
        <tr>
            <td><tt class="literal">hibernate.cglib.use_reflection_optimizer</tt></td>
            <td>开启CGLIB来替代运行时反射机制(系统级属性). 反射机制有时在除错时比较有用. 注意即使关闭这个优化, Hibernate还是需要CGLIB. 你不能在<tt class="literal">hibernate.cfg.xml</tt>中设置此属性.
            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p>
            </td>
        </tr>
    </tbody>
</table>
8、<strong>SQL方言 </strong><strong>&nbsp;&nbsp; Hibernate SQL方言 (<tt class="literal">hibernate.dialect</tt>) </strong>
<table height="614" width="520" 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">org.hibernate.dialect.DB2Dialect</tt></td>
        </tr>
        <tr>
            <td>DB2 AS/400</td>
            <td><tt class="literal">org.hibernate.dialect.DB2400Dialect</tt></td>
        </tr>
        <tr>
            <td>DB2 OS390</td>
            <td><tt class="literal">org.hibernate.dialect.DB2390Dialect</tt></td>
        </tr>
        <tr>
            <td>PostgreSQL</td>
            <td><tt class="literal">org.hibernate.dialect.PostgreSQLDialect</tt></td>
        </tr>
        <tr>
            <td>MySQL</td>
            <td><tt class="literal">org.hibernate.dialect.MySQLDialect</tt></td>
        </tr>
        <tr>
            <td>MySQL with InnoDB</td>
            <td><tt class="literal">org.hibernate.dialect.MySQLInnoDBDialect</tt></td>
        </tr>
        <tr>
            <td>MySQL with MyISAM</td>
            <td><tt class="literal">org.hibernate.dialect.MySQLMyISAMDialect</tt></td>
        </tr>
        <tr>
            <td>Oracle (any version)</td>
            <td><tt class="literal">org.hibernate.dialect.OracleDialect</tt></td>
        </tr>
        <tr>
            <td>Oracle 9i/10g</td>
            <td><tt class="literal">org.hibernate.dialect.Oracle9Dialect</tt></td>
        </tr>
        <tr>
            <td>Sybase</td>
            <td><tt class="literal">org.hibernate.dialect.SybaseDialect</tt></td>
        </tr>
        <tr>
            <td>Sybase Anywhere</td>
            <td><tt class="literal">org.hibernate.dialect.SybaseAnywhereDialect</tt></td>
        </tr>
        <tr>
            <td>Microsoft SQL Server</td>
            <td><tt class="literal">org.hibernate.dialect.SQLServerDialect</tt></td>
        </tr>
        <tr>
            <td>SAP DB</td>
            <td><tt class="literal">org.hibernate.dialect.SAPDBDialect</tt></td>
        </tr>
        <tr>
            <td>Informix</td>
            <td><tt class="literal">org.hibernate.dialect.InformixDialect</tt></td>
        </tr>
        <tr>
            <td>HypersonicSQL</td>
            <td><tt class="literal">org.hibernate.dialect.HSQLDialect</tt></td>
        </tr>
        <tr>
            <td>Ingres</td>
            <td><tt class="literal">org.hibernate.dialect.IngresDialect</tt></td>
        </tr>
        <tr>
            <td>Progress</td>
            <td><tt class="literal">org.hibernate.dialect.ProgressDialect</tt></td>
        </tr>
        <tr>
            <td>Mckoi SQL</td>
            <td><tt class="literal">org.hibernate.dialect.MckoiDialect</tt></td>
        </tr>
        <tr>
            <td>Interbase</td>
            <td><tt class="literal">org.hibernate.dialect.InterbaseDialect</tt></td>
        </tr>
        <tr>
            <td>Pointbase</td>
            <td><tt class="literal">org.hibernate.dialect.PointbaseDialect</tt></td>
        </tr>
        <tr>
            <td>FrontBase</td>
            <td><tt class="literal">org.hibernate.dialect.FrontbaseDialect</tt></td>
        </tr>
        <tr>
            <td>Firebird</td>
            <td><tt class="literal">org.hibernate.dialect.FirebirdDialect</tt></td>
        </tr>
    </tbody>
</table>
9、<strong>Hibernate日志类别 </strong>
<table height="315" width="745" summary="                    Hibernate日志类别&#13;&#10;    " border="1">
    <thead>
        <tr>
            <th>类别 </th>
            <th>功能 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class="literal">org.hibernate.SQL</tt></td>
            <td>在所有SQL DML语句被执行时为它们记录日志 </td>
        </tr>
        <tr>
            <td><tt class="literal">org.hibernate.type</tt></td>
            <td>为所有JDBC参数记录日志 </td>
        </tr>
        <tr>
            <td><tt class="literal">org.hibernate.tool.hbm2ddl</tt></td>
            <td>在所有SQL DDL语句执行时为它们记录日志 </td>
        </tr>
        <tr>
            <td><tt class="literal">org.hibernate.pretty</tt></td>
            <td>在session清洗(flush)时，为所有与其关联的实体(最多20个)的状态记录日志 </td>
        </tr>
        <tr>
            <td><tt class="literal">org.hibernate.cache</tt></td>
            <td>为所有二级缓存的活动记录日志 </td>
        </tr>
        <tr>
            <td><tt class="literal">org.hibernate.transaction</tt></td>
            <td>为事务相关的活动记录日志 </td>
        </tr>
        <tr>
            <td><tt class="literal">org.hibernate.jdbc</tt></td>
            <td>为所有JDBC资源的获取记录日志 </td>
        </tr>
        <tr>
            <td><tt class="literal">org.hibernate.hql.ast</tt></td>
            <td>为HQL和SQL的自动状态转换和其他关于查询解析的信息记录日志 </td>
        </tr>
        <tr>
            <td><tt class="literal">org.hibernate.secure</tt></td>
            <td>为JAAS认证请求做日志 </td>
        </tr>
        <tr>
            <td><tt class="literal">org.hibernate</tt></td>
            <td>为任何Hibernate相关信息做日志 (信息量较大, 但对查错非常有帮助)</td>
        </tr>
    </tbody>
</table>
   <img src ="http://www.blogjava.net/youngsun/aggbug/207480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-06-12 20:02 <a href="http://www.blogjava.net/youngsun/articles/207480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>