﻿<?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-X-Spirit-随笔分类-Java 轻量级企业开发</title><link>http://www.blogjava.net/zhangwei217245/category/43168.html</link><description>Always Beyond the Time</description><language>zh-cn</language><lastBuildDate>Tue, 23 Mar 2010 17:09:32 GMT</lastBuildDate><pubDate>Tue, 23 Mar 2010 17:09:32 GMT</pubDate><ttl>60</ttl><item><title>[转]关于hibernate的缓存使用 </title><link>http://www.blogjava.net/zhangwei217245/archive/2010/03/23/316264.html</link><dc:creator>X-Spirit</dc:creator><author>X-Spirit</author><pubDate>Tue, 23 Mar 2010 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/zhangwei217245/archive/2010/03/23/316264.html</guid><wfw:comment>http://www.blogjava.net/zhangwei217245/comments/316264.html</wfw:comment><comments>http://www.blogjava.net/zhangwei217245/archive/2010/03/23/316264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangwei217245/comments/commentRss/316264.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangwei217245/services/trackbacks/316264.html</trackback:ping><description><![CDATA[<span style="font-size: 8pt;"></span>
<h1 style="margin: 17pt 0cm 16.5pt 21.25pt;">原文出自 http://blog.csdn.net/woshichenxu/archive/2006/01/22/586361.aspx<br />
</h1>
<h1 style="margin: 17pt 0cm 16.5pt 21.25pt;"><br />
</h1>
<h1 style="margin: 17pt 0cm 16.5pt 21.25pt;"><font face="Times New Roman"><font color="#999999"><font size="5">1.</font><span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font><font size="5"><font color="#999999"><span style="font-family: 宋体;">关于</span><font face="Times New Roman">hibernate</font></font></font><span><span style="font-family: 宋体;"><font color="#999999" size="5">缓
存的问题：</font></span></span></h1>
<h3 style="margin: 13pt 0cm 13pt 35.45pt;"><font face="Times New Roman"><font color="#999999"><font size="3">1.1.1.</font><span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><font color="#999999" size="3">&nbsp;&nbsp;&nbsp;</font></font><span style="font-family: 宋体;"><font color="#999999" size="3">基本的缓存原理</font></span></h3>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 12pt;"><font face="Times New Roman">Hibernate</font></span><span style="font-size: 12pt; font-family: 宋体;">缓存分为二级，第一级存放于</span><span style="font-size: 12pt;"><font face="Times New Roman">session</font></span><span style="font-size: 12pt; font-family: 宋体;">中称为一级缓存，默认带有且不能卸载。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 12pt; font-family: 宋体;">第二级是由</span><span style="font-size: 12pt;"><font face="Times New Roman">sessionFactory</font></span><span style="font-size: 12pt; font-family: 宋体;">控制的进程级缓存。是全局共享的缓存，凡是会调用二级缓存的查
询方法</span><span style="font-size: 12pt; font-family: 宋体;">都会从中受益。只有经正确的配置后二级缓存才会发挥作用。同时
在进行条件查询时必须使用相应的方法才能从缓存中获取数据。比如</span><span style="font-size: 12pt;"><font face="Times New Roman">Query.iterate()</font></span><span style="font-size: 12pt; font-family: 宋体;">方法、</span><span style="font-size: 12pt;"><font face="Times New Roman">load</font></span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;"><font face="Times New Roman">get</font></span><span style="font-size: 12pt; font-family: 宋体;">方法等。必须注意的是</span><span style="font-size: 12pt;"><font face="Times New Roman">session.find</font></span><span style="font-size: 12pt; font-family: 宋体;">方法永远是从数据库中获取数据，不会从二级缓存中获取数据，即
便其中有其所需要的数据也是如此。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 12pt; font-family: 宋体;">查询时使用缓存的实现过程为：首先查询一级缓存中是否具有需要
的数据，如果没有，查询二级缓存，如果二级缓存中也没有，此时再执行查询数据库的工作。要注意的是：此</span><span style="font-size: 12pt;"><font face="Times New Roman">3</font></span><span style="font-size: 12pt; font-family: 宋体;">种方式的查询速度是依次降低的。</span></p>
<h2 style="margin: 13pt 0cm 13pt 1cm;"><font color="#999999">1.2.<span style="font: 7pt &quot;Times New Roman&quot;;"><font size="5">&nbsp;&nbsp; </font></span><span style="font-family: 黑体;">存在的问题</span></font></h2>
<h3 style="margin: 13pt 0cm 13pt 35.45pt;"><font face="Times New Roman"><font color="#999999"><font size="3">1.2.1.</font><span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font><span style="font-family: 宋体;"><font color="#999999" size="3">一级缓存的问题以及使用二级缓存
的原因</font></span></h3>
<p style="margin: 0cm 0cm 0pt;"><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp; <span style="font-size: 12pt;">&nbsp;</span></font></font><span style="font-size: 12pt; font-family: 宋体;">因为</span><span style="font-size: 12pt;"><font face="Times New Roman">Session</font></span><span style="font-size: 12pt; font-family: 宋体;">的生命期往往很短，存在于</span><span style="font-size: 12pt;"><font face="Times New Roman">Session</font></span><span style="font-size: 12pt; font-family: 宋体;">内部的第一级最快缓存的生命期当然也很短，<span style="color: blue;">所以第一级缓存的命中率是很低的</span>。其对系统性能的改善也是很有限的。当然，这个</span><span style="font-size: 12pt;"><font face="Times New Roman">Session</font></span><span style="font-size: 12pt; font-family: 宋体;">内部缓存的主要作用是保持</span><span style="font-size: 12pt;"><font face="Times New Roman">Session</font></span><span style="font-size: 12pt; font-family: 宋体;">内部数据状态同步。并非是</span><span style="font-size: 12pt;"><font face="Times New Roman">hibernate</font></span><span style="font-size: 12pt; font-family: 宋体;">为了大幅提高系统性能所提供的。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">为了提高使用</span><span style="font-size: 12pt;"><font face="Times New Roman">hibernate</font></span><span style="font-size: 12pt; font-family: 宋体;">的性能，除了常规的一些需要注意的方法比如：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体;">使用延迟加载、迫切外连接、查询过滤等以外，还需要配置</span><span style="font-size: 12pt;"><font face="Times New Roman">hibernate</font></span><span style="font-size: 12pt; font-family: 宋体;">的二级缓存。其对系统整体性能的改善往往具有立竿见影的效果！</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">（经过自己以前作项目的经验，一般会有</span><span style="font-size: 12pt;"><font face="Times New Roman">3~4</font></span><span style="font-size: 12pt; font-family: 宋体;">倍的性能提高）</span></p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt;"><font face="Times New Roman"><font color="#999999"><font size="3">1.2.2.</font><span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><font color="#999999" size="3">N+1</font></font><span><span style="font-family: 宋体;"><font color="#999999" size="3">次
查询的问题</font></span></span></h3>
<p style="margin: 0cm 0cm 0pt; text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">执行条件查询时，</span><span style="font-size: 12pt;"><font face="Times New Roman">iterate</font></span><span style="font-size: 12pt; font-family: 宋体;">（）方法具有著名的</span><span style="font-size: 12pt; font-family: 宋体;">&#8220;</span><span style="font-size: 12pt;"><font face="Times New Roman">n+</font><font face="Times New Roman">1</font><span style="font-family: 宋体;">&#8221;</span><span style="font-family: 宋体;">次查询的问题<span>，也就是说在第一
次查询时</span></span><font face="Times New Roman">iterate</font></span><span style="font-size: 12pt; font-family: 宋体;">方法会执行满足条件的查询结果数再加一次（</span><span style="font-size: 12pt;"><font face="Times New Roman">n+1</font></span><span style="font-size: 12pt; font-family: 宋体;">）的查询。但是此问题只存在于第一次查询时，在后面执行相同查
询时性能会得到极大的改善。此方法适合于查询数据量较大的业务数据。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">但是注意：当数据量特别大时（比如流水线数据等）需要针对此持
久化对象配置其具体的缓存策略，比如设置其存在于缓存中的最大记录数、缓存存在的时间等参数，<span style="color: red;">以避
免系统将大量的数据同时装载入内存中引起内存资源的迅速耗尽，反而降低系统的性能！！！</span></span></p>
<h2 style="margin: 13pt 0cm 13pt 1cm;"><font color="#999999">1.3.<span style="font: 7pt &quot;Times New Roman&quot;;"><font size="5">&nbsp;&nbsp; </font></span><span style="font-family: 黑体;">使用</span>hibernate</font><span><span style="font-family: 黑体;"><font color="#999999">二级缓存的其他注意
事项：</font></span></span></h2>
<h3 style="margin: 13pt 0cm 13pt 35.45pt;"><font face="Times New Roman"><font color="#999999"><font size="3">1.3.1.</font><span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font><span style="font-family: 宋体;"><font color="#999999" size="3">关于数据的有效性</font></span></h3>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 12pt; font-family: 宋体;">另外，</span><span style="font-size: 12pt; color: red;"><font face="Times New
Roman">hibernate</font></span><span style="font-size: 12pt; color: red; font-family: 宋体;">会自行维护二级缓存中的数据，以保证缓存中的数据和数据库中的真实数据的一致性！</span><span style="font-size: 12pt; font-family: 宋体;">无论何时，当你调用</span><span style="font-size: 12pt;"><font face="Times New Roman">save()</font></span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;"><font face="Times New Roman">update()</font></span><span style="font-size: 12pt; font-family: 宋体;">或</span><span style="font-size: 12pt;"><font face="Times New Roman">&nbsp;saveOrUpdate()</font></span><span style="font-size: 12pt; font-family: 宋体;">方法传递一个对象时，或使用</span><span style="font-size: 12pt;"><font face="Times New Roman">load()</font></span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;"><font face="Times New Roman">&nbsp;get()</font></span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;"><font face="Times New Roman">list()</font></span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;"><font face="Times New Roman">iterate()&nbsp;</font></span><span style="font-size: 12pt; font-family: 宋体;">或</span><span style="font-size: 12pt;"><font face="Times New Roman">scroll()</font></span><span style="font-size: 12pt; font-family: 宋体;">方法获得一个对象时</span><span style="font-size: 12pt;"><font face="Times New Roman">,&nbsp;</font></span><span style="font-size: 12pt; font-family: 宋体;">该对象都将被加入到</span><span style="font-size: 12pt;"><font face="Times New Roman">Session</font></span><span style="font-size: 12pt; font-family: 宋体;">的内部缓存中。</span><span style="font-size: 12pt;"><font face="Times New Roman">&nbsp;</font></span><span style="font-size: 12pt; font-family: 宋体;">当随后</span><span style="font-size: 12pt;"><font face="Times New Roman">flush()</font></span><span style="font-size: 12pt; font-family: 宋体;">方法被调用时，对象的状态会和数据库取得同步。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.6pt;"><span style="font-size: 12pt; font-family: 宋体;">也就是说删除、更新、增加数据的时候，同时更新缓存。当然这也
包括二级缓存！</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 12pt; color: red; font-family: 宋体;">只要是调用</span><span style="font-size: 12pt; color: red;"><font face="Times New
Roman">hibernate API</font></span><span style="font-size: 12pt; color: red; font-family: 宋体;">执行数据库相关的工作。</span><span style="font-size: 12pt; color: red;"><font face="Times New Roman">hibernate</font></span><span style="font-size: 12pt; color: red; font-family: 宋体;">都会为你自动保证</span><span style="font-size: 12pt; color: red; font-family: 宋体;">缓存数据的有效性！！</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 12pt; font-family: 宋体;">但是，如果你使用了</span><span style="font-size: 12pt;"><font face="Times New Roman">JDBC</font></span><span style="font-size: 12pt; font-family: 宋体;">绕过</span><span style="font-size: 12pt;"><font face="Times New Roman">hibernate</font></span><span style="font-size: 12pt; font-family: 宋体;">直接执行对数据库的操作。此时，</span><span style="font-size: 12pt;"><font face="Times New Roman">Hibernate</font></span><span style="font-size: 12pt; font-family: 宋体;">不会</span><span style="font-size: 12pt;"><font face="Times New Roman">/</font></span><span style="font-size: 12pt; font-family: 宋体;">也不可能自行感知到数据库被进行的变化改动，也就不能再保证缓
存中数据的有效性！！</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 12pt; font-family: 宋体;">这也是所有的</span><span style="font-size: 12pt;"><font face="Times New Roman">ORM</font></span><span style="font-size: 12pt; font-family: 宋体;">产品共同具有的问题。幸运的是，</span><span style="font-size: 12pt;"><font face="Times New Roman">Hibernate</font></span><span style="font-size: 12pt; font-family: 宋体;">为我们暴露了</span><span style="font-size: 12pt;"><font face="Times New Roman">Cache</font></span><span style="font-size: 12pt; font-family: 宋体;">的清除方法，这给我们提供了一个手动保证数据有效性的机会！！</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 12pt; font-family: 宋体;">一级缓存，二级缓存都有相应的清除方法。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 12pt; font-family: 宋体;">其中二级缓存提供的清除方法为：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 117.6pt;"><span style="font-size: 12pt; font-family: 宋体;">按对象</span><span style="font-size: 12pt;"><font face="Times New Roman">class</font></span><span style="font-size: 12pt; font-family: 宋体;">清空缓存</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 12pt;"><span><font face="Times
New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="font-size: 12pt; font-family: 宋体;">按对象</span><span style="font-size: 12pt;"><font face="Times New Roman">class</font></span><span style="font-size: 12pt; font-family: 宋体;">和对象的主键</span><span style="font-size: 12pt;"><font face="Times New Roman">id</font></span><span style="font-size: 12pt; font-family: 宋体;">清空缓存</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 12pt;"><span><font face="Times
New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="font-size: 12pt; font-family: 宋体;">清空对象的集合中的缓存数据等。</span></p>
<p style="margin: 0cm 0cm 0pt;"><font face="Times New Roman" size="3">&nbsp;&nbsp;&nbsp; </font></p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt;"><font face="Times New Roman"><font color="#999999"><font size="3">1.3.2.</font><span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font><span style="font-family: 宋体;"><font color="#999999" size="3">适合使用的情况</font></span></h3>
<br />
<p style="margin: 0cm 0cm 0pt; text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">并非所有的情况都适合于使用二级缓存，需要根据具体情况来决
定。同时可以针对某一个持久化对象配置其具体的缓存策略。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体;">适合于使用二级缓存的情况：</span></p>
<p style="margin: 0cm 0cm 0pt 30pt; text-indent: -18pt;"><span style="font-size: 12pt;"><font face="Times New Roman">1、</font></span><span style="font-size: 12pt; font-family: 宋体;">数据不会被第三方修改；</span></p>
<p style="margin: 0cm 0cm 0pt 30pt;"><span style="font-size: 12pt; font-family: 宋体;">一般情况下，会被</span><span style="font-size: 12pt;"><font face="Times New Roman">hibernate</font></span><span style="font-size: 12pt; font-family: 宋体;">以外修改的数据最好不要配置二级缓存，以免引起不一致的数据。
但是如果此数据因为性能的原因需要被缓存，同时又有可能被第</span><span style="font-size: 12pt;"><font face="Times New Roman">3</font></span><span style="font-size: 12pt; font-family: 宋体;">方比如</span><span style="font-size: 12pt;"><font face="Times New Roman">SQL</font></span><span style="font-size: 12pt; font-family: 宋体;">修改，也可以为其配置二级缓存。只是此时需要在</span><span style="font-size: 12pt;"><font face="Times New Roman">sql</font></span><span style="font-size: 12pt; font-family: 宋体;">执行修改后手动调用</span><span style="font-size: 12pt;"><font face="Times New Roman">cache</font></span><span style="font-size: 12pt; font-family: 宋体;">的清除方法。以保证数据的一致性</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="Times New Roman">&nbsp;2</font></span><span style="font-size: 12pt; font-family: 宋体;">、数据大小在可接收范围之内；</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><span><font face="Times
New Roman">&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="font-size: 12pt; font-family: 宋体;">如果数据表数据量特别巨大，此时不适合于二级缓存。原因是缓存的数据量过大可能会引起内存资源紧张，反而降低性能。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><span style="font-size: 12pt; font-family: 宋体;">如果数据表数据量特别巨大，但是经常使用的往往只是较新的那部
分数据。此时，也可为其配置二级缓存。但是必须单独配置其持久化类的缓存策略，比如最大缓存数、缓存过期时间等，将这些参数降低至一个合理的范围（太高会
引起内存资源紧张，太低了缓存的意义不大）。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="Times New Roman">&nbsp;3</font></span><span style="font-size: 12pt; font-family: 宋体;">、数据更新频率低；</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><span><font face="Times
New Roman">&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="font-size: 12pt; font-family: 宋体;">对于数据更新频率过高的数据，频繁同步缓存中数据的代价可能和</span><span style="font-size: 12pt; font-family: 宋体;">查询缓存中的数据从中获得的好处相当，坏处益处相抵消。此时缓
存的意义也不大。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="Times New Roman">&nbsp;4</font></span><span style="font-size: 12pt; font-family: 宋体;">、非关键数据（不是财务数据等）</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 12pt;"><span><font face="Times
New Roman">&nbsp; </font></span></span><span style="font-size: 12pt; font-family: 宋体;">财务数据等是非常重要的数据，绝对不允许出现或使用无效的数据，所以此时为了安全起见最好不要使用二级缓存。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 12pt;"><span><font face="Times
New Roman">&nbsp; </font></span></span><span style="font-size: 12pt; font-family: 宋体;">因为此时</span><span style="font-size: 12pt; font-family: 宋体;">&#8220;正确性&#8221;的重要性远远大于</span><span style="font-size: 12pt; font-family: 宋体;">&#8220;高性能&#8221;的重要性。</span></p>
<h1 style="margin: 17pt 0cm 16.5pt 21.25pt;"><font face="Times New Roman"><font color="#999999"><font size="5">2.</font><span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font><font size="5"><font color="#999999"><span style="font-family: 宋体;">目前系统中使用</span><font face="Times New Roman">hibernate</font></font></font><span><span style="font-family: 宋体;"><font color="#999999" size="5">缓
存的建议</font></span></span></h1>
<h2 style="margin: 13pt 0cm 13pt 1cm;"><font color="#999999">1.4.<span style="font: 7pt &quot;Times New Roman&quot;;"><font size="5">&nbsp;&nbsp; </font></span><span style="font-family: 黑体;">目前情况</span></font></h2>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;一般系统中有三种情况会绕开hibernate执行数据库</span><span style="font-size: 12pt; font-family: 宋体;">操作：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="宋体">&nbsp;&nbsp;
此种情况使用hibernate二级缓存会不可避免的造成数据不一致的问题，</font></span></p>
<p style="margin: 0cm 0cm 0pt;">&nbsp;<span style="font-size: 12pt;"><font face="宋体">详细的设计。比如在设计上
避免对同一数据表的同时的写入操作，</font></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="宋体">&nbsp;&nbsp;
使用数据库各种级别的锁定机制等。</font></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="Times New Roman">2</font></span><span style="font-size: 12pt; font-family: 宋体;">、动态表相关</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;所谓&#8220;动态表&#8221;是指在系统运行时根据用户的操作系统自动建
立的数据表。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;
比如&#8220;自定义表单&#8221;等属于用户自定义扩展开发性质的功能模块，因为此时数据表是运行时建立的，所以不能进行hibernate的映射。因此对它的操作只能
是绕开hibernate的直接数据库JDBC操作。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="font-size: 12pt; font-family: 宋体;">如果此时动态表中的数据没有设计缓存，就不存在数据不一致的问
题。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;如果此时自行设计了缓存机制，则调用自己的缓存同步方法即
可。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="Times New Roman">3</font></span><span style="font-size: 12pt; font-family: 宋体;">、使用</span><span style="font-size: 12pt;"><font face="Times New Roman">sql对
hibernate持久化对象表</font></span><span style="font-size: 12pt; font-family: 宋体;">进行批量删除时</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; 此时</font></span><span style="font-size: 12pt; font-family: 宋体;">执行批量删除后，缓存中会存在已被删除的数据。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 24pt;"><span style="font-size: 12pt;"><font face="Times New Roman">分
析：&nbsp;</font></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp; 当执行了第3条（</span><span style="font-size: 12pt;"><font face="Times New Roman">sql</font></span><span style="font-size: 12pt; font-family: 宋体;">批量删除）后，后续的查询只可能是以下三种方式：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="Times New Roman">a.
session.find</font></span><span style="font-size: 12pt; font-family: 宋体;">（）方法：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">根据前面的总结，</span><span style="font-size: 12pt;"><font face="Times New Roman">find</font></span><span style="font-size: 12pt; font-family: 宋体;">方法不会查询二级缓存的数据，而是直接查询数据库。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体;">所以不存在数据有效性的问题。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="Times New Roman">b. </font></span><span style="font-size: 12pt; font-family: 宋体;">调用</span><span style="font-size: 12pt;"><font face="Times New Roman">iterate</font></span><span style="font-size: 12pt; font-family: 宋体;">方法执行条件查询时：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">根据</span><span style="font-size: 12pt;"><font face="Times New Roman">iterate</font></span><span style="font-size: 12pt; font-family: 宋体;">查询方法的执行方式，其每次都会到数据库中查询满足条件的</span><span style="font-size: 12pt;"><font face="Times New Roman">id</font></span><span style="font-size: 12pt; font-family: 宋体;">值，然后再根据此</span><span style="font-size: 12pt;"><font face="Times New Roman">id </font></span><span style="font-size: 12pt; font-family: 宋体;">到缓存中获取数据，当缓存中没有此</span><span style="font-size: 12pt;"><font face="Times New Roman">id</font></span><span style="font-size: 12pt; font-family: 宋体;">的数据才会执行数据库查询；</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">如果此记录已被</span><span style="font-size: 12pt;"><font face="Times New Roman">sql</font></span><span style="font-size: 12pt; font-family: 宋体;">直接删除，则</span><span style="font-size: 12pt;"><font face="Times New Roman">iterate</font></span><span style="font-size: 12pt; font-family: 宋体;">在执行</span><span style="font-size: 12pt;"><font face="Times New Roman">id</font></span><span style="font-size: 12pt; font-family: 宋体;">查询时不会将此</span><span style="font-size: 12pt;"><font face="Times New Roman">id</font></span><span style="font-size: 12pt; font-family: 宋体;">查询出来。所以，即便缓存中有此条记录也不会被客户获得，也就
不存在不一致的情况。（此情况经过测试验证）</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="Times New Roman">c. </font></span><span style="font-size: 12pt; font-family: 宋体;">用</span><span style="font-size: 12pt;"><font face="Times New Roman">get</font></span><span style="font-size: 12pt; font-family: 宋体;">或</span><span style="font-size: 12pt;"><font face="Times New Roman">load</font></span><span style="font-size: 12pt; font-family: 宋体;">方法按</span><span style="font-size: 12pt;"><font face="Times New Roman">id</font></span><span style="font-size: 12pt; font-family: 宋体;">执行查询：</span></p>
<p style="margin: 0cm 0cm 0pt 18pt;"><span style="font-size: 12pt; font-family: 宋体;">客观上此时会查询得到已过期的数据。但是又因为系统中执行<span style="font-size: 12pt;"><font face="Times New Roman">sql</font></span><span style="font-size: 12pt; font-family: 宋体;">批量删除一般是</span></span></p>
<p style="margin: 0cm 0cm 0pt 18pt;"><span style="font-size: 12pt; font-family: 宋体;"><span style="font-size: 12pt; font-family: 宋体;">针对中间关联数据表，对于</span></span></p>
<p style="margin: 0cm 0cm 0pt 18pt;"><span style="font-size: 12pt; font-family: 宋体;">中间关联表的查询一般都是采用条件查询</span><span style="font-size: 12pt;"><font face="Times New Roman"> ,</font></span><span style="font-size: 12pt; font-family: 宋体;">按</span><span style="font-size: 12pt;"><font face="Times New Roman">id</font></span><span style="font-size: 12pt; font-family: 宋体;">来查询某一条关联关系的几率很低</span><span style="font-size: 12pt;"><font face="Times New Roman">,</font></span><span style="font-size: 12pt; font-family: 宋体;">所以此问题也不存在</span><span style="font-size: 12pt;"><font face="Times New Roman">!</font></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;</font></span><span style="font-size: 12pt; font-family: 宋体;">如果某个值对象确实需要按</span><span style="font-size: 12pt;"><font face="Times New Roman">id</font></span><span style="font-size: 12pt; font-family: 宋体;">查询一条关联关系</span><span style="font-size: 12pt;"><font face="Times New Roman">,</font></span><span style="font-size: 12pt; font-family: 宋体;">同时又因为数据量大使用</span><span style="font-size: 12pt; font-family: 宋体;">了</span><span style="font-size: 12pt;"><font face="Times New Roman">sql</font></span><span style="font-size: 12pt; font-family: 宋体;">执行批量删除。当满足此两个条件时</span><span style="font-size: 12pt;"><font face="Times New Roman">,</font></span><span style="font-size: 12pt; font-family: 宋体;">为了保证按</span><span style="font-size: 12pt;"><font face="Times New Roman">id </font></span><span style="font-size: 12pt; font-family: 宋体;">的查询得到正确的结果</span><span style="font-size: 12pt;"><font face="Times New Roman">,</font></span><span style="font-size: 12pt; font-family: 宋体;">可以使用手动清楚二级缓存中此对象的数据的方法</span><span style="font-size: 12pt;"><font face="Times New Roman">!!</font></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="Times New Roman">(</font></span><span style="font-size: 12pt; font-family: 宋体;">此种情况出现的可能性较小</span><span style="font-size: 12pt;"><font face="Times New Roman">)</font></span></p>
<h2 style="margin: 13pt 0cm 13pt 1cm;"><font color="#999999">1.5.<span style="font: 7pt &quot;Times New Roman&quot;;"><font size="5">&nbsp;&nbsp; </font></span><span style="font-family: 黑体;">建议</span></font></h2>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><span style="font-size: 12pt;"><font face="Times New Roman">1</font></span><span style="font-size: 12pt; font-family: 宋体;">、建议不要使用</span><span style="font-size: 12pt;"><font face="Times New Roman">sql</font></span><span style="font-size: 12pt; font-family: 宋体;">直接执行数据持久化对象的数据的更新，但是可以执行</span><span style="font-size: 12pt; font-family: 宋体;">批量删除。（系统中需要批量更新的地方也较少）</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><span style="font-size: 12pt;"><font face="Times New Roman">2</font></span><span style="font-size: 12pt; font-family: 宋体;">、如果必须使用</span><span style="font-size: 12pt;"><font face="Times New Roman">sql</font></span><span style="font-size: 12pt; font-family: 宋体;">执行数据的更新，必须清空此对象的缓存数据。调用</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="Times New Roman">SessionFactory.evict(class)
</font></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt;"><font face="Times New Roman">SessionFactory.evict(class,id)</font></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: 12pt; font-family: 宋体;">等方法。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><span style="font-size: 12pt;"><font face="Times New Roman">3</font></span><span style="font-size: 12pt; font-family: 宋体;">、在批量删除数据量不大的时候可以直接采用</span><span style="font-size: 12pt;"><font face="Times New Roman">hibernate</font></span><span style="font-size: 12pt; font-family: 宋体;">的批量删除，这样就不存在绕开</span><span style="font-size: 12pt;"><font face="Times New Roman">hibernate</font></span><span style="font-size: 12pt; font-family: 宋体;">执行</span><span style="font-size: 12pt;"><font face="Times New Roman">sql</font></span><span style="font-size: 12pt; font-family: 宋体;">产生的缓存数据一致性的问题。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><span style="font-size: 12pt;"><font face="Times New Roman">4</font></span><span style="font-size: 12pt; font-family: 宋体;">、不推荐采用</span><span style="font-size: 12pt;"><font face="Times New Roman">hibernate</font></span><span style="font-size: 12pt; font-family: 宋体;">的批量删除方法来删除大批量的记录数据。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><span style="font-size: 12pt; font-family: 宋体;">原因是</span><span style="font-size: 12pt;"><font face="Times New Roman">hibernate</font></span><span style="font-size: 12pt; font-family: 宋体;">的批量删除会执行</span><span style="font-size: 12pt;"><font face="Times New Roman">1</font></span><span style="font-size: 12pt; font-family: 宋体;">条查询语句外加</span><span style="font-size: 12pt; font-family: 宋体;">满足条件的</span><span style="font-size: 12pt;"><font face="Times New Roman">n</font></span><span style="font-size: 12pt; font-family: 宋体;">条删除语句。而不是一次执行一条条件删除语句！！</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><span style="font-size: 12pt; font-family: 宋体;">当待删除的数据很多时会有很大的性能瓶颈！！！如果批量删除数
据量较大</span><span style="font-size: 12pt;"><font face="Times
New Roman">,</font></span><span style="font-size: 12pt; font-family: 宋体;">比如超过</span><span style="font-size: 12pt;"><font face="Times New Roman">50</font></span><span style="font-size: 12pt; font-family: 宋体;">条</span><span style="font-size: 12pt;"><font face="Times New Roman">,</font></span><span style="font-size: 12pt; font-family: 宋体;">可以采用</span><span style="font-size: 12pt;"><font face="Times New Roman">JDBC</font></span><span style="font-size: 12pt; font-family: 宋体;">直接删除。这样作的好处是只执行一条</span><span style="font-size: 12pt;"><font face="Times New Roman">sql</font></span><span style="font-size: 12pt; font-family: 宋体;">删除语句</span><span style="font-size: 12pt;"><font face="Times New Roman">,</font></span><span style="font-size: 12pt; font-family: 宋体;">性能会有很大的改善。同时，缓存数据同步的问题</span><span style="font-size: 12pt;"><font face="Times New Roman">,</font></span><span style="font-size: 12pt; font-family: 宋体;">可以采用</span><span style="font-size: 12pt;"><font face="Times New Roman">
hibernate</font></span><span style="font-size: 12pt; font-family: 宋体;">清
除二级缓存中的相关数据的方法。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><span style="font-size: 12pt; font-family: 宋体;">调用</span><span style="font-size: 12pt;"><font face="Times New Roman"> SessionFactory.evict(class) </font></span><span style="font-size: 12pt; font-family: 宋体;">；</span><span style="font-size: 12pt;"><font face="Times New Roman">SessionFactory.evict(class,id)</font></span><span style="font-size: 12pt; font-family: 宋体;">等方法。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><span style="font-size: 12pt; font-family: 宋体;">所以说，对于一般的应用系统开发而言（不涉及到集群，分布式数
据同步问题等），因为只在中间关联表执行批量删除时调用了</span><span style="font-size: 12pt;"><font face="Times New Roman">sql</font></span><span style="font-size: 12pt; font-family: 宋体;">执行，同时中间关联表一般是执行条件查询不太可能执行按</span><span style="font-size: 12pt;"><font face="Times New Roman">id</font></span><span style="font-size: 12pt; font-family: 宋体;">查询。所以，此时可以直接执行</span><span style="font-size: 12pt;"><font face="Times New Roman">sql</font></span><span style="font-size: 12pt; font-family: 宋体;">删除，甚至不需要调用缓存的清除方法。这样做不会导致以后配置
了二级缓存引起数据有效性的问题。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><span style="font-size: 12pt; font-family: 宋体;">退一步说，即使以后真的调用了按</span><span style="font-size: 12pt;"><font face="Times New Roman">id</font></span><span style="font-size: 12pt; font-family: 宋体;">查询中间表对象的方法，也可以通过调用清除缓存的方法来解决。</span></p>
<h1 style="margin: 0cm 0cm 0pt; text-indent: 36pt;">4、具体的配置方法&nbsp;</h1>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><font size="4">根据我了解的很多hibernate的使用者在调用其相应方法时都迷信的相信&#8220;hibernate会自行为我们处理性能的问题&#8221;，或
者&#8220;hibernate会自动为我们的所有操作调用缓存&#8221;,实际的情况是hibernate虽然为我们提供了很好的缓存机制和扩展缓存框架的支持，但是必
须经过正确的调用其才有可能发挥作用！！所以造成很多使用hibernate的系统的性能问题，实际上并不是hibernate不行或者不好，而是因为使
用者没有正确的了解其使用方法造成的。相反，如果配置得当hibernate的性能表现会让你有相当&#8220;惊喜的&#8221;发现。下面我讲解具体的配置方法.</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><font size="4">&nbsp;ibernate提供了二级缓存的接口： <br />
net.sf.hibernate.cache.Provider, <br />
同
时提供了一个默认的 实现net.sf.hibernate.cache.HashtableCacheProvider， <br />
也可以配置
其他的实现 比如ehcache,jbosscache等。 </font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><font size="4">具体的配置位置位于hibernate.cfg.xml文件中 <br />
&lt;property
name="hibernate.cache.use_query_cache"&gt;true&lt;/property&gt; <br />
&lt;property
name="hibernate.cache.provider_class"&gt;net.sf.hibernate.cache.HashtableCacheProvider&lt;/property&gt;
</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><font size="4">很多的hibernate使用者在 配置到 这一步 就以为 完事了， <br />
注意：其实光这样配，根本
就没有使用hibernate的二级缓存。同时因为他们在使用hibernate时大多时候是马上关闭session，所以，一级缓存也没有起到任何作
用。结果就是没有使用任何缓存，所有的hibernate操作都是直接操作的数据库！！性能可以想见。 </font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><font size="4">正确的办法是除了以上的配置外还应该配置每一个vo对象的具体缓存策略，在影射文件中配置。例如： </font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><font size="4">&lt;hibernate-mapping&gt; <br />
&lt;class
name="com.sobey.sbm.model.entitySystem.vo.DataTypeVO"
table="dcm_datatype"&gt; <br />
&lt;cache usage="read-write"/&gt; <br />
&lt;id
name="id" column="TYPEID" type="java.lang.Long"&gt; <br />
&lt;generator
class="sequence"/&gt; <br />
&lt;/id&gt; </font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><font size="4">&lt;property name="name" column="NAME"
type="java.lang.String"/&gt; <br />
&lt;property name="dbType"
column="DBTYPE" type="java.lang.String"/&gt; <br />
&lt;/class&gt; <br />
&lt;/hibernate-mapping&gt;
</font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><br />
<font size="4">关键就是这个&lt;cache usage="read-write"/&gt;，其有几个选择 <br />
read-
only,read-write,transactional,等 <br />
然后在执行查询时 注意了
，如果是条件查询，或者返回所有结果的查询，此时session.find()方法
不会获取缓存中的数据。只有调用query.iterate()方法时才会调缓存的数据。 </font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 36pt;"><font size="4">同时 get 和 load方法 是都会查询缓存中的数据 .</font></p>
<p><font size="4">对于不同的缓存框架具体的配置方法会有不同，但是大体是以上的配置</font></p>
<p><font size="4">（另外，对于支持事务型，以及支持集群的环境的配置我会争取在后续的文章中中 发表出来）</font> </p>
<h1 style="margin: 17pt 0cm 16.5pt 21.25pt;"><font face="Times New Roman"><font color="#999999"><font size="5">3.</font><span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font><span style="font-family: 宋体;"><font color="#999999" size="5">总结</font></span></h1>
<p style="margin: 0cm 0cm 0pt 21.2pt; text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">总之是根据不同的业务情况和项目情况
对</span><span style="font-size: 12pt;"><font face="Times
New Roman">hibernate</font></span><span style="font-size: 12pt; font-family: 宋体;">进行有效的配置和正确的使用，扬长避短。不存在适合于任何情况的一个&#8220;万能&#8221;的方案。</span></p>
<p style="margin: 0cm 0cm 0pt 23.95pt; text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">以上结论及建议均建立在自己在对</span><span style="font-size: 12pt;"><font face="Times New Roman"> Hibernate 2.1.2</font></span><span style="font-size: 12pt; font-family: 宋体;">中的测试结果以及以前的项目经验的基础上。如有谬处，请打家提
出指正:)!</span></p>
<p style="margin: 0cm 0cm 0pt 23.95pt; text-indent: 24pt;"><span style="font-size: 12pt; font-family: 宋体;">最后，祝大家
新年快乐！！在新的一年里 取得人生的进步！！！</span></p>
<img src ="http://www.blogjava.net/zhangwei217245/aggbug/316264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangwei217245/" target="_blank">X-Spirit</a> 2010-03-23 11:21 <a href="http://www.blogjava.net/zhangwei217245/archive/2010/03/23/316264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NetBeans中配置OperaMask+Spring+JPA教程</title><link>http://www.blogjava.net/zhangwei217245/archive/2010/03/17/306338.html</link><dc:creator>X-Spirit</dc:creator><author>X-Spirit</author><pubDate>Wed, 17 Mar 2010 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/zhangwei217245/archive/2010/03/17/306338.html</guid><wfw:comment>http://www.blogjava.net/zhangwei217245/comments/306338.html</wfw:comment><comments>http://www.blogjava.net/zhangwei217245/archive/2010/03/17/306338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangwei217245/comments/commentRss/306338.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangwei217245/services/trackbacks/306338.html</trackback:ping><description><![CDATA[<h4>创建项目：</h4>
<p>打开NetBeans 6.5.1，选择文件—》新建项目，选择Java Web，然后在项目列表中选择 Web 应用程序，下一步 </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1m1iVSGVg7V1j4y4mnDiB6Q3OCcy8QSIwZZyDh4-0QmKqCEd2DvZ1x7jgcf7K3fgqye7apYzmOzA24nxwqKfEA-ue5FAqG1goXe464D3uXBB_DsquAHidV6JT0ri04CERtQ0PbtwvbfoGvhTaP6zH_Iw/clip_image002[5].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image002" alt="clip_image002" src="https://o12vrg.blu.livefilestore.com/y1mybFEX_OdG8sKRWdkeOhGU_PzpIWvoSHCG-AUNwvG5s5YsBImZi8WTyJ7Ls6zt61TLMqBD6q7D2iwbdvOYSTd1JIh7dGLikBRaulfsjKK-n1_6AV-uqv58Rjox_v5DakFecLReUHh9oGR87g2nLuUqA/clip_image002_thumb[2].jpg" height="325" width="468" border="0" /></a> </p>
<p>选择使用专用文件夹存储库，指定库文件夹的位置，通常是默认的.\lib，即项目文件夹下的lib文件夹，下一步 </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1mstsxtr9eBbzOLZYtqwcBL_0iqbffSnyfKgXgZoPhntngmvXZQFYGxRvv4-g4unl_sxOr6yfN-q956S0AEbbIbgI1Utj9fctAObga9bzC7ocDhRdH20wWiSqHzYG3eX0csq9WuXVyqb2_3eiz_SHmlw/clip_image004[4].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image004" alt="clip_image004" src="https://o12vrg.blu.livefilestore.com/y1mP5TZ5YY2ZutZrnbVV2tjJANiJWGm7s41DTlBIbvH03ZtfGFlYH7OIzP6tNwmg-lT1yhkYz9K8PksKbulsVyr39oF0_0RDMT1Exc5-L5ZarY-PIUSG-fi9TD-5R_eyABCRuq0z1Fk2y0het9gQkTDww/clip_image004_thumb[1].jpg" height="340" width="490" border="0" /></a> </p>
<p>选择Web应用服务器。这里选择Tomcat 6.0.18 ，Java EE版本选择 Java EE 5，下一步 </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1m8Yck8z2F8uhlfBs1CbWGv9-dvrA1FUSzoA0byO3A1OLmqRudalCY575enkC73OHpsDOMMvvdIWHm2Gyf7JsvXpirG2G4dEWGhspUFAxgVSuK6ARnY1mE6RMFZNoDQX1UgEdCG24rI6EUTV3HyOyfxw/clip_image006[4].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image006" alt="clip_image006" src="https://o12vrg.blu.livefilestore.com/y1mTyRNjn4M0uVE07YA_Cj_yQisVswceZTI_Np1f-erYeQpFvLbfJt3iuAdq1ni_6LV0pJQBH36ra5eCvcLIe8BULdCmzBgLNSWZa7pNcR8rHuonVsmLKcR9VUpMDDSRRQGRTE-e6qBubpFAW6W6nkNUQ/clip_image006_thumb[1].jpg" height="321" width="473" border="0" /></a> </p>
<p>在框架对话框中什么都不选择，直接点击完成。 </p>
<h4>配置项目：</h4>
<p><strong>1. </strong><strong>配置OperaMask</strong> </p>
<p>在WEB-INF文件夹下新建一个faces-config.xml文件，内容如下： </p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt; </p>
<p>&lt;faces-config xmlns="http://java.sun.com/xml/ns/javaee"  </p>
<p>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" </p>
<p>xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  </p>
<p>http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" version="1.2"&gt; </p>
<p>&lt;application&gt; </p>
<p>&lt;view-handler&gt;com.sun.facelets.FaceletViewHandler&lt;/view-handler&gt; </p>
<p>&lt;/application&gt; </p>
<p>&lt;/faces-config&gt; </p>
<p>在新创建的项目中，右键单击&#8220;库&#8221;节点，选择添加库 </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1m4q9WKLgK4Tx2AgBfUgWcSZEyl5vzhabjrf-MXo72SSBbeM2oAK2k5Hjfz6Y5ggRpK5wS9TyWua9L3Dh9_I1M0nBGrhG0--gzvTpLdzTqrvjSbbLJ_iQb6FTZbhpf2HzP6m5CxuShzOG1X0uqma8EiQ/clip_image008[4].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image008" alt="clip_image008" src="https://o12vrg.blu.livefilestore.com/y1msVaJiP4O3V8SZwJjFbLXpsjCuJ90d2KwCf4OqrKmuEROP-HLBcpavPdrLCcbSpjdqphF13JPcxlzuCaAP95VHYEOw27QKi5VEUavmXzPVlZLPtTlXMXVWSapSwEcMBGL_usCyn1WE2-dQHRGCOnrVA/clip_image008_thumb[1].jpg" height="344" width="260" border="0" /></a> </p>
<p>然后选择导入，选择Spring 2.5库，选择导入库，添加库。 </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1m4I3aWFdekWF8hN01L9JfQstD9YSkv3dYtjyooFPEgNw8RLVatIPSscIIrcxWcpdOnq7Ke60CVxaYX4LfaQJNbzbLjzIYPc4xWpA02G58iZzWmT5t2D1XyqN9vLohwE_loKuDZJgS7pRDddow14EZdw/clip_image010[15].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image010" alt="clip_image010" src="https://o12vrg.blu.livefilestore.com/y1maoPDbp7Nson5amMKxm7dRTMu715S6-YeevQtfLC8HhJ2Ue9O8747KI9jPCfHC8mqKdISHs1lKJgavMpVeNTzUJ9rUBmSKaVVEIWlKdNbtvT5ZgBvtyoKQi_jJ4QKSrlB9EiXcUFmqWDlA4W1w-iZsg/clip_image010_thumb[12].jpg" height="350" width="566" border="0" /></a> </p>
<p>再次选择添加库，然后选择创建。库名称为OperaMask，库类型为类库： </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1mTcx_O0O-FW3x9eJ6jWIE9_ZW40puGDD50LaVeiaSnsSeryy6uDq3esI4wCEEXGqilliBJIexD0qoBwdKXkwCbwHg6kR0G4-WjVEmotACvLVCOF3bFCnsY4r-os6qHvIHKjvjX25Ax5OFm1DwYg6ZkA/clip_image012[4].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image012" alt="clip_image012" src="https://o12vrg.blu.livefilestore.com/y1mOHkrIvKsxYl-ZbdFBidB7j9ZRl7gaNwdRfM8e4R23SdAXeHZfSD-UfJLPfrANP5rMgpPB2JPeu8UaeTwEO63rb0I37m_bSDFSGxbjg2ONPPXfPmKdxwx78Moo_3mjp9vU3q_a3pnH7xpQkqRd1odjQ/clip_image012_thumb[1].jpg" height="408" width="389" border="0" /></a> </p>
<p>在&#8220;定制库&#8221;中选择&#8220;添加JAR/文件夹&#8221;，在弹出的对话框中选择OperaMask的基本jar包，并将导入方式指定为：复制到库文件夹。 </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1moNQPu-uK-2osZNKP1pwOGkS2N270udHKxXNCRYUs99K90uq0Pyo3bJujC2a-qgvyO_VypWa-Hc01XTGg215-QuDNK5xz4EWb1pGlE5_t9yZv5DMBw1BsaDc6gHY7BfiuU8jNqzOFvj1EEuVBJwrMkw/clip_image014[4].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image014" alt="clip_image014" src="https://o12vrg.blu.livefilestore.com/y1moy5Ibexrdclm4LqFtZS8W0YzOcMHQjxz3qdJV_kpXaY19EvowKR8xb-Xh6Vh9zF4Flyzow2E6YlkU0Co8CON-wKwx39ZhQe0vHkdKXXLO2dLX-g165DtMx5vaYNcWh2-RwIr_UAfQwAUHmVeRvMFFA/clip_image014_thumb[1].jpg" height="437" width="447" border="0" /></a> </p>
<p>一路选是。 </p>
<p><strong>2. </strong><strong>配置Spring</strong><strong>以及与OperaMask</strong><strong>的整合</strong> </p>
<p><strong></strong> </p>
<p>然后再创建一个OperaMask_SpringCompatibility库，将OperaMask中的spring文件夹下的operamasks-spring.jar添加进来 </p>
<p>然后在新创建的项目中展开WEB-INF文件夹，打开web.xml：按照OperaMask包中的blank样例程序的配置进行配置。 </p>
<p>之后，在web.xml中配置如下内容：
<table cellpadding="0" cellspacing="0" border="1">
    <tbody>
        <tr>
            <td width="568" valign="top">
            <p>&lt;context-param&gt; </p>
            <p>&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; </p>
            <p>&lt;param-value&gt;classpath:applicationContext*.xml&lt;/param-value&gt; </p>
            <p>&lt;/context-param&gt; </p>
            <p>&lt;listener&gt; </p>
            <p>&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt; </p>
            <p>&lt;/listener&gt;</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>然后，在源包节点下创建Spring配置文件applicationContext.xml，选择如图所示的几个命名空间： </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1mv4Kg1cIC_ZyC9QSlCiULN5ZHDgvlqjuoShj7YJXpLfHpp8XGWvSH_9W0CUXsHKkXVBzWejKVK7lO4MXDa1KdmQbNJSupes4srHoh-dIrQoMb8JAoS3pNqCOR6Ac_l_9lBtzempFtLYH5yqgOqDqNSg/clip_image016[5].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image016" alt="clip_image016" src="https://o12vrg.blu.livefilestore.com/y1mJm04MRshUD-ugSqqmRIBt8ARHcwVU88yncLUSy3gpOrLr6v_ceNp1O6pXFkMXp2wUXyeIoszWWRP2WpqYB_Z8TnAyFDm3_ToXI5zEkDiDcYHabuQjxjt_hILp3NL6DY-ILTqswgKamr9Md4qKr5SQQ/clip_image016_thumb[2].jpg" height="280" width="543" border="0" /></a> </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1mB7-nhQH5DQ1T_eFZ0a50C3uOTWyYi5yuXdbllSlGe7fJee-8p1wBORKx7-W3nhV0vVc26Ral9U6mphrOLCBxFaY1YtY4hQMPSfsxxXdX8LCOw_KlX9Z4x7NOi4EiUhXPLu1obW7NjjveYMaQHTpQVQ/clip_image018[5].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image018" alt="clip_image018" src="https://o12vrg.blu.livefilestore.com/y1m1G4hw6rf_QEtonTSnaGvx8TfxlweWKmT-FgThKLcbYLxkHQ5F_0V-VQ1KAZeNRwIJDYZJiJhMUQZgi_sJaqLcRUNise1l7y3KJLD0N3_EYPlw7HM-2s_7rwELEuRWvlT654Ogn4ydxDeoN5Yb1JAdg/clip_image018_thumb[2].jpg" height="386" width="558" border="0" /></a> </p>
<p>选择完成，然后在Beans节点之间添加如下内容：
<table cellpadding="0" cellspacing="0" border="1">
    <tbody>
        <tr>
            <td width="568" valign="top">
            <p>&lt;!-- 开启基于注解的配置 --&gt; </p>
            <p>&lt;context:annotation-config/&gt; </p>
            <p>&lt;!-- 使 AOM 中的 LiteBean 同样能够被 Spring 所感应到 --&gt; </p>
            <p>&lt;bean class="org.operamasks.faces.spring.ManagedBeanConfigurer"/&gt; </p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><strong>3. </strong><strong>配置JPA</strong><strong>持久化支持</strong> </p>
<p>在服务选项卡中，选择MySQL数据库驱动，然后右键单击，选择连接设置，配置你要使用的数据库： </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1mELqtl7noTdc0WmSNVtvAVSqqAEflSLrGPObZCtyzpPNHEGHrGPaA1EYpKUWNk0U7rytrb1Wh1GmdNnpU4LSOZ-TH7iITPYeqvAyxRC_qwthJTGCpPbY7lkX7mk_YSLHWTOrw8XlIs9cyZW-NWApM6w/clip_image020[4].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image020" alt="clip_image020" src="https://o12vrg.blu.livefilestore.com/y1mEc8Thg-TLayZYO3hQdqpMSj3WxSAXo73cDnx8p1XMXDr9sJi6bQT7UQzPBhWhE7fCdJx57EExsz07UnEJ6cRdZYAzEgalEweeyaGIJC0hi_atkl4AXEU4r4_8SVAD3xY2DsQ0jEQYKIkDgbONPzqqA/clip_image020_thumb[1].jpg" height="383" width="250" border="0" /></a> </p>
<p>数据库配置完毕，然后回到项目选项卡，右键单击刚创建的项目，选择新建--&gt;其它--&gt;持久性--&gt;持久性单元 </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1mn9LpEHNtTK0gmAii88A6PvoLuQdzIAEmH4RfaDVmcZQYTwGjkLkbptUfsBj3rRVEhclu6mLRxVU580VK7jJuUVKBHDz7t5mN568JxdnP-felx2PAmO165LsS2c1uMW-PazqO_QmTkl4qEfmfCaOw1w/clip_image022[4].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image022" alt="clip_image022" src="https://o12vrg.blu.livefilestore.com/y1mFl0UD0IAPqL5rDFc1iW1bL7_9yI0TVazA-cy2lgu6tdulJa97Gf0GJ56v2hc2iprnS2ecBu0DA8Qd44HFrFtIKFT2AecY-m6vvnlwdVKQRGhALNZMYVBWWqYvBYnVwm-fBAQnn-JN54sgt1I-NYU8w/clip_image022_thumb[1].jpg" height="368" width="533" border="0" /></a> </p>
<p>在新建持久性单元对话框中选择持久性库为Hibernate，即选择Hibernate为JPA持久单元的实现，数据库连接选择我们刚配置好的MySQL连接。 </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1mxG5NEg3oGN9poi3yknWc-ot1I9Y7ZdQ5w-NFpWWrJySF1rwg59QGXwz7nfd9WwtElBYVt414aruiiNJzh4GYsuQq458rr72uwPrO5uJOzG1H2_tuL5sDrL1tHxIvNGcVHZKxu7QMr9twhT5ajwnJtA/clip_image024[4].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image024" alt="clip_image024" src="https://o12vrg.blu.livefilestore.com/y1mieN9NwD2stulfV97E63iP9bIp8DhtyfJk4sdCoKONp_yIia0so83mOoas837eU2kn0lBQjdT6DIDbHK1sR1oOP18VJ-1R36RWX43JEcwsBW37RxDKYh-kZ0-N6USqQiv9X46uv0FVaSO0RrVn-T22g/clip_image024_thumb[1].jpg" height="366" width="559" border="0" /></a> </p>
<p>单击完成。此时，Hibernate的JPA库已经被添加到项目的lib目录下了。包含了基本的Hibernate jar包和Hibernate JPA支持jar包。 </p>
<p>注：使用JPA的一个好处就是我们不需要在一个统一的配置文件里罗列所有的实体类，而是可以让实体管理器自动扫描所有被@Entity注解了的实体类。要实现这种功能，如果项目的JPA实现迁移到TopLink Essential，需要加入下面的配置： </p>
<p>找到项目中的&#8220;配置文件&#8221;节点，打开persistence.xml文件，调整到XML视图中，在&lt;provider&gt; &lt;/provider&gt;节点后添加： </p>
<p>&lt;exclude-unlisted-classes&gt;false&lt;/exclude-unlisted-classes&gt; 一行。如果希望使用Hibernate实现，请一定不要加入这一行，否则，您必须将您创建的所有实体类逐一添加到persistence.xml中。 </p>
<p>如果要使用Spring提供的JpaTemplate（即实现JpaDaoSupport方式），则回到spring的applicationContext.xml文件，在&lt;beans&gt;节点里面添加：
<table cellpadding="0" cellspacing="0" border="1">
    <tbody>
        <tr>
            <td width="692" valign="top">
            <p>&lt;!-- 利用Spring的实体管理器工厂来创建JPA实体管理器，传入的参数为persistence.xml中指定的持久化单元名称 --&gt; </p>
            <p>&lt;bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"&gt; </p>
            <p>&lt;property name="persistenceUnitName" value="DMCSv1PU"/&gt; </p>
            <p>&lt;/bean&gt; </p>
            <p>&lt;!-- 声明一个Spring提供的JPA事务管理器，传入的参数正是Spring中的实体管理器工厂 --&gt; </p>
            <p>&lt;bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"&gt; </p>
            <p>&lt;property name="entityManagerFactory" ref="entityManagerFactory"/&gt; </p>
            <p>&lt;/bean&gt; </p>
            <p>&lt;!-- 开启Spring提供的基于注解的声明式事务管理 --&gt; </p>
            <p>&lt;tx:annotation-driven transaction-manager="txManager"/&gt;</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>至此，持久化支持配置完毕。 </p>
<h4>创建实体类和相应的JPA控制类</h4>
<p>右键单击项目，选择新建--&gt;其它--&gt;持久性--&gt;通过数据库生成实体类，选择数据库表： </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1ma_OUPGr6PXoUNgbMXgDyO-i0QPovp9ehrSgCmsOWfuxh1TuDtdC6769ykegzVtwc-fsOcfvsSGp9mc-adEowzX35X8ridNMtlalPILhincJxQ_8j_scwBiWCGaza3Nwgqs57CnrCUs0lLlezIE1pcw/clip_image026[4].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image026" alt="clip_image026" src="https://o12vrg.blu.livefilestore.com/y1mnLRNwNLHLGeRRtCucLTrxw-mZ5yEtfPj9-sQ4NueI9XAxSzsHX8PZxvb5cUqqye47iGOdn7a7RHzS76uDA-um0-7qe2a6ZSUtWt8AfdrnjrJYbXeD_IvUleKhNDTUjbw0KBNMoHfYFGaRiIhpg2kFA/clip_image026_thumb[1].jpg" height="315" width="456" border="0" /></a> </p>
<p>点击下一步，输入合适的包名 </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1myB4ymxGsnMPEq23O91_nRhbS7AEmw9DKkoQf6DlcnPnryCzbZy_pxwDtZZVZrqlhvRZoN8edZnVf_CfyT6F_c8f_3oifxhDFegLq_2fRL1TeMWMO9OFtji6c4o4LwEryDIBBU_fwanzYW-7EF3rgbQ/clip_image028[4].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image028" alt="clip_image028" src="https://o12vrg.blu.livefilestore.com/y1mNrG5QaBWJB05SrDuUcIh_bH3LxqH2BdKmcsekAXsYnnoqUzvTg4nSaYJg3aqGPLq37mQ0gZ0LkiilAeXPirmVIHSlg282K5dexkpN3Un7txgryClhQuir26CP-B4Us-6M3D2BYuh4fKVYQJ8BSdXaA/clip_image028_thumb[1].jpg" height="309" width="453" border="0" /></a> </p>
<p>下一步，映射选项如下图所示： </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1mgXEnxpcJVw8VPNVGNgWQibfdsFpp2H-10EuTBcP6OX7Pm7UUAPOtmXLVMxbQMtUvoV01fnrozTIo3DBldi75E0m6riw6Yt31Nvq1VIsJRJ7KcN4J7g5Pwe3uUMT5rPzVDmqu4K8ZcIbs2gJF5FChLw/clip_image030[4].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image030" alt="clip_image030" src="https://o12vrg.blu.livefilestore.com/y1mElJXadTK-crYwLeuEdsTUC6dJYeEyZdY2xPJ7eW8viX1sm3uWP_IoV9yDI8SO71iV4z2uLQoENR3j_h6Hnki73c3411IBBdjQuCM0Y25j5bC3VDRirlo-9627eDMxdWgCoB2QBSdEdmdBl-kZccoiQ/clip_image030_thumb[1].jpg" height="329" width="479" border="0" /></a> </p>
<p>选择新建--&gt;其它--&gt;持久性--&gt;基于实体类的JPA控制器类，下一步： </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1mAbOTK_-kxl6gzC9zUHs0etywAtIoF9LgnRspHYOCY2bI-WlSpCx8IcjIhZNzT2GPChP49BsQAw3X4tHQD0tFRlLcDWrUAdylSfpP2LJUVPMMG2TJ1fKASjSm1DvRuqu4kwEGQaDehFe3FVwh5Y_V-g/clip_image032[4].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image032" alt="clip_image032" src="https://o12vrg.blu.livefilestore.com/y1mb6NjUmIxiyPNlL7s45saUFEsglZkw6-0TwizXz7dq6C7LH0u3pS-mSDwl6cWYX5Qz-zr1AK3iMyBTZMFRyrhTW373I2JHQoUV04idczydHOI2sznL9RTsnb6REQ5FzI_ujTkV1IZ5MXTATBi2jbyqw/clip_image032_thumb[1].jpg" height="355" width="512" border="0" /></a> </p>
<p>添加要生成控制器类的实体类，下一步： </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1mTKcUg2GC3YqeP1qRNxZZVyVUcd5fXSbB2m1lsx0Vxw9ypnsQmO46GKCBA3q9SstF2TPEjPAKWZK525b9DyzqBYYYiCQGH04iw9YsSTu9IiwlnpmVV4ArSGqYqArA3VxPqx48eCbfSLOd6Di8XSy0Cg/clip_image034[4].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image034" alt="clip_image034" src="https://o12vrg.blu.livefilestore.com/y1mmZrcaesb4_hgp7BP8nA3jO6sH9TVrei-dppBF-T0oGz6eTCzetjsn1r9kDmBFMDwm6pKwbhHyDPuFkGhqSTKUAZvWWMWTUYHK96G8ElboZ2uZ0Qi0EwvQtG8wsLJ1NliuSOMAEW2UmFeX16qJ81VZg/clip_image034_thumb[1].jpg" height="356" width="513" border="0" /></a> </p>
<p>选择合适的包，然后完成。 </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1mM0AlyCxzScd0o47hq0X0Qc7biCfo38rPRriHJiGCkQdfEqX1CMbFv6DfmcVTnEyOU5-eEL2YJ63DEVs0V3rIg5xFJr32sbQFC5vfl6IO4OHZVmSGH6p2g-eqSD5B4UvL8HhSEajspkTjPwl-zOvqSQ/clip_image036[4].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image036" alt="clip_image036" src="https://o12vrg.blu.livefilestore.com/y1mE5gPurdw3o89o4ii5tehegZp60sJP4ipsBqIEu4V1vZd7Nftk_XHp5tE8NqVONjxgksPZT6mqX9s1WZfZHD_h28cgMMpe-Yn77lXvnq-0TQ7JfZAVGeuXAY_JtLpOl-s1odymW2LfpHIWg_fHLYQQQ/clip_image036_thumb[1].jpg" height="336" width="508" border="0" /></a> </p>
<p>后面的配置无非就是将JPA的控制器类写入Spring的配置文件，然后在AOM的LiteBean中注入这些控制器类，实现数据库操作以及相应的业务逻辑。 </p>
<p>注：解决Spring与Hibernate JPA的冲突： </p>
<p><a href="https://o12vrg.blu.livefilestore.com/y1m5KNPaOzz60AQOn6JZ9TVbi0z_I7oH_uPc6FvUciCZSvw6EBRzWlBakntPYUWSED3EkE7ObDDpH27ktUrOskiYOeK5voCqowys1GA9EhPsAvQ8kfpq3OwiO4bSys-q21ZbtFVqmavAjJi7UczUeT21w/clip_image038[4].jpg" rel="WLPP"><img style="border: 0px none; display: inline;" title="clip_image038" alt="clip_image038" src="https://o12vrg.blu.livefilestore.com/y1mFcuUOnkrS1YPnZZI1SEmdIL7ZrvW-JTCAMzURcAvg_2at6gIY_flRhbeuzq1FTj05G_S2XebmbSMCb9nbtU3LQccwzBaeKZ-XffgBBO901zZ9nt_PeXdMgO7MFfAjnDw-ZG-LFiWgmVJHYtmUb8rbg/clip_image038_thumb[1].jpg" height="389" width="510" border="0" /></a> </p>
<p>如上图所示：选择工具--&gt; 库 --&gt; 库位置--&gt;选择当前编辑的项目，选中Spring Framework 2.5，然后去掉cglib2.2那个jar包。这个包与Hibernate JPA中的cglib 2.1.3.jar有冲突   </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<br />
文章来源:<a href="http://x-spirit.spaces.live.com/Blog/cns!CC0B04AE126337C0!776.entry">http://x-spirit.spaces.live.com/Blog/cns!CC0B04AE126337C0!776.entry</a>
<img src ="http://www.blogjava.net/zhangwei217245/aggbug/306338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangwei217245/" target="_blank">X-Spirit</a> 2010-03-17 13:33 <a href="http://www.blogjava.net/zhangwei217245/archive/2010/03/17/306338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>