<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>JustinC</title>
    <description>在路上......</description>
    <link>http://justinc.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>购物车总结</title>
        <author>justin8335</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justinc.javaeye.com">justin8335</a>&nbsp;
          链接：<a href="http://justinc.javaeye.com/blog/134100" style="color:red;">http://justinc.javaeye.com/blog/134100</a>&nbsp;
          发表时间: 2007年10月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          购物车总结：<br />
写一个购物车的类Cart<br />
public class Cart {<br />
&nbsp;&nbsp;&nbsp;&nbsp; private float totalPrice;//总价<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; private float savingMoney;//节省的金额<br />
<br />
&nbsp;&nbsp;&nbsp; //使用一个Map来保存购物车信息<br />
&nbsp;&nbsp;&nbsp; protected&nbsp; Map&lt;String,Orderitem&gt; items;<br />
&nbsp;&nbsp;&nbsp; //初始化购物车，如果是第一次添加，则创建一个购物车信息集合<br />
&nbsp;&nbsp;&nbsp; public Cart(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(items==null){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; items = new HashMap&lt;String,Orderitem&gt;();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; //添加购物车信息<br />
&nbsp;&nbsp;&nbsp; public void addToCart(String bookId , Orderitem ot){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(items.containsKey(bookId)){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Orderitem _ot =&nbsp;&nbsp;&nbsp; items.get(bookId); //_ot是原来的购物车中的OrderItem对象<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; _ot.setNumber(ot.getNumber()+_ot.getNumber());<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; items.put(bookId, _ot);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //否则直接加入一个购物信息<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; items.put(bookId, ot);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; //更新购物车信息（数量）<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void updateCart(String bookId , Orderitem ot){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //直接覆盖最近的数据信息 <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; items.put(bookId, ot);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; //删除购物车信息<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void deleteFromCart(String bookId){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; items.remove(bookId);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; //取打折后总价格<br />
&nbsp;&nbsp;&nbsp; public float getTotalPrice(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; float totalPrice = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(Iterator it = items.values().iterator();it.hasNext();){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Orderitem ot = (Orderitem)it.next();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Book book = ot.getBook();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; totalPrice += ot.getNumber()*(book.getPrice()*(book.getDiscount()*0.01));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return totalPrice;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; //取节省的钱<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;public float getSavingMoney(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; float savingMoney = 0 ;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(Iterator it = items.values().iterator();it.hasNext();){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Orderitem ot = (Orderitem)it.next();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Book book = ot.getBook();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; savingMoney += ot.getNumber()*(book.getPrice()*(float)(1-book.getDiscount()*0.01));<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return savingMoney;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public Map&lt;String, Orderitem&gt; getItems() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return items;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setItems(Map&lt;String, Orderitem&gt; items) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.items = items;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
}<br />
<br />
在验证用户登陆的地方，验证成功后创建一个Cart对象，并将它保存在session会话中<br />
当我们要添加，更新，删除购物信息时，从session中存取该Cart对象
          <br/>
          <span style="color:red;">
            <a href="http://justinc.javaeye.com/blog/134100#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 21 Oct 2007 23:03:25 +0800</pubDate>
        <link>http://justinc.javaeye.com/blog/134100</link>
        <guid>http://justinc.javaeye.com/blog/134100</guid>
      </item>
      <item>
        <title>分页总结</title>
        <author>justin8335</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justinc.javaeye.com">justin8335</a>&nbsp;
          链接：<a href="http://justinc.javaeye.com/blog/134099" style="color:red;">http://justinc.javaeye.com/blog/134099</a>&nbsp;
          发表时间: 2007年10月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          分页总结：<br />
<br />
通过当前页判断是否有上一页下一页和首尾页<br />
通过总记录数得出总页数<br />
public class Pager {<br />
<br />
&nbsp;&nbsp;&nbsp; private int currentPage;//当前页码<br />
&nbsp;&nbsp;&nbsp; private int pageSize=3;//每页记录数<br />
&nbsp;&nbsp;&nbsp; private int totalPage;//总页数<br />
&nbsp;&nbsp;&nbsp; private int totalSize;//总记录数<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private boolean hasFirst; <br />
&nbsp;&nbsp;&nbsp; private boolean hasPrevious;<br />
&nbsp;&nbsp;&nbsp; private boolean hasNext;<br />
&nbsp;&nbsp;&nbsp; private boolean hasLast;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; //初始化<br />
&nbsp;&nbsp;&nbsp; public Pager(int currentPage,int totalSize){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.currentPage=currentPage;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.totalSize=totalSize;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public int getCurrentPage() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return currentPage;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setCurrentPage(int currentPage) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.currentPage = currentPage;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public boolean isHasFirst() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(this.currentPage == 1){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void setHasFirst(boolean hasFirst) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.hasFirst = hasFirst;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public boolean isHasLast() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(this.currentPage == this.getTotalPage()){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setHasLast(boolean hasLast) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.hasLast = hasLast;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public boolean isHasNext() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(this.isHasLast()){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setHasNext(boolean hasNext) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.hasNext = hasNext;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public boolean isHasPrevious() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(this.isHasFirst()){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setHasPrevious(boolean hasPrevious) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.hasPrevious = hasPrevious;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public int getPageSize() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return pageSize;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setPageSize(int pageSize) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.pageSize = pageSize;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public int getTotalPage() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; totalPage = totalSize/pageSize;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(totalSize%pageSize!=0)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; totalPage++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return totalPage;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setTotalPage(int totalPage) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.totalPage = totalPage;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public int getTotalSize() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return totalSize;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setTotalSize(int totalSize) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.totalSize = totalSize;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
<br />
<br />
&nbsp;//DAO<br />
public List queryByPager(int currentPage,int pageSize){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //计算起始行从0开始<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; final int startRow =&nbsp; (currentPage-1)*pageSize ;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; final int maxResults = pageSize;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //利用回调接口，调用Hibernate原生API<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; List bookList =(List) getHibernateTemplate().execute(new HibernateCallback(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public Object doInHibernate(Session session)throws HibernateException,SQLException{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Query query = session.createQuery(&quot;From Book as b left join fetch&nbsp; b.category &quot;)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setFirstResult(startRow)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setMaxResults(maxResults);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return query.list();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return bookList;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }
          <br/>
          <span style="color:red;">
            <a href="http://justinc.javaeye.com/blog/134099#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 21 Oct 2007 23:02:34 +0800</pubDate>
        <link>http://justinc.javaeye.com/blog/134099</link>
        <guid>http://justinc.javaeye.com/blog/134099</guid>
      </item>
      <item>
        <title>Spring中的数据访问使用Hibernate</title>
        <author>justin8335</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justinc.javaeye.com">justin8335</a>&nbsp;
          链接：<a href="http://justinc.javaeye.com/blog/133980" style="color:red;">http://justinc.javaeye.com/blog/133980</a>&nbsp;
          发表时间: 2007年10月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Spring中的数据访问<br />
<br />
<br />
不管使用哪种DAO技术，Spring提供了统一的异常处理机制。<br />
使用O/R Mapping的访问框架中的模版(HibernateTemplate),开发者无需考虑是否要处理异常，<br />
因为SpringDAO代劳了这些工作。<br />
<br />
HibernateDaoSupport：Hibernate DAO抽象类，开发者需要为他配置Hibernate SessionFactory。<br />
通过注入的方式实现。通过HibernateDaoSupport之类，可以获得HibernateTemplate.<br />
Spring中的所有模版类都是线程安全的包括(HibernateTemplate)<br />
<br />
定义Hibernate资源<br />
使用JNDI 或者是 DBCP 配置数据源<br />
<br />
<br />
<br />
<br />
（1）想要直接使用HibernateTemplate，必须先在DAO对象中定义sessionFactory,<br />
然后注入sessionFactory ，在相应的DAO对象里定义sessionFactory变量，以及他的<br />
Setter方法。<br />
<br />
最后，开发者实现HibernateTemplate调用过程时，需要实现HibernateCallback回调接口。<br />
可以发现，这种回调实现能够实现基于Hibernate的DAO访问。<br />
与此同时，HibernateTemplate能够保证正确的打开和关闭HibernateSession，并自动参与到<br />
事务当中。HibernateTemplate是线程安全的，对于简单的Hibernate操作，比如单个find,<br />
saveOrUpdate操作，直接使用HibernateTemplate比较有效率。<br />
<br />
（2）还可以让DAO实现HibernateDaoSupport接口 ，但这样使得Hibernate与Spring的耦合度增加<br />
<br />
在处理简单的数据库操作时，使用HibernateTemplate带的find(),save()等的方法效率更好。<br />
如果处理比较复杂的操作时(比如分页)可以使用hibernate的回调接口<br />
<br />
List bookList =(List) getHibernateTemplate().execute(new HibernateCallback(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public Object doInHibernate(Session session)throws HibernateException,SQLException{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Query query = session.createQuery(&quot;From Book as b left join fetch&nbsp; b.category &quot;)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setFirstResult(startRow)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setMaxResults(maxResults);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return query.list();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; });
          <br/>
          <span style="color:red;">
            <a href="http://justinc.javaeye.com/blog/133980#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 21 Oct 2007 15:56:03 +0800</pubDate>
        <link>http://justinc.javaeye.com/blog/133980</link>
        <guid>http://justinc.javaeye.com/blog/133980</guid>
      </item>
      <item>
        <title>Spring事务管理</title>
        <author>justin8335</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justinc.javaeye.com">justin8335</a>&nbsp;
          链接：<a href="http://justinc.javaeye.com/blog/129030" style="color:red;">http://justinc.javaeye.com/blog/129030</a>&nbsp;
          发表时间: 2007年10月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          数据库事务必须具备ACID特性，即Atomic（原子性），Consistency（一致性），Isolation（隔离性）和Durability（持久性）。<br />
对于开发人员来说，并不需要了解数据库事务的底层细节，只需要通过数据库系统提供的接口，就可以按照业务需求来控制事务。<br />
<br />
Spring提供了强大而简便的事务处理功能，核心就是PlatformTransactionManager抽象接口。<br />
Spring将所有事务管理都抽象为<strong>PlatformTransactionManager、TransactoinStatus和TransactionDefinition</strong>这三个接口。<br />
<br />
<strong>PlatformTransactionManager</strong>定义了事务管理，所有与事务相关的操作都由PlatformTransactionManager管理；<br />
<br />
<strong>TransactionStatus</strong>定义了事务状态，PlatformTransactionManager会根据TransactionStatus的状态来决定是否回滚事务。<br />
<br />
<strong>TransactionDefinition</strong>定义了事务的隔离级别和传播行为，在启动事务时，PlatformTransactionManager根据TransactionDefinition来启动合适的事务。<br />
<br />
事务的隔离级别是由底层的数据库系统实现的。<br />
事务的传播行为则是应用程序自己管理的，他决定了<font color="#339966">事务</font><font color="#339966">如何在应用程序中传播</font>，一般是由底层框架来完成。<br />
<br />
Spring支持如下的事务传播行为：<br />
词汇：<br />
<div>
<div style="padding: 5px 0px 0px;"><span style="color: rgb(128, 128, 128);"><strong><span style="font-size: 10pt; color: rgb(0, 0, 0); line-height: 1.2em;">propagation</span></strong> &nbsp;[<span style="font-size: 10pt; color: rgb(0, 153, 0); line-height: 1.2em; font-family: 'Lingoes Unicode';">,prɒpә'geiʃәn</span>]</span><font color="#c00000">n.</font> &nbsp;增殖, 繁殖, 宣传&nbsp; [医]  传播, 繁殖, 持续培养<br />
<div>
<div style="padding: 5px 0px 0px;"><span style="color: rgb(128, 128, 128);"><strong><span style="font-size: 10pt; color: rgb(0, 0, 0); line-height: 1.2em;">mandatory</span></strong> &nbsp;[<span style="font-size: 10pt; color: rgb(0, 153, 0); line-height: 1.2em; font-family: 'Lingoes Unicode';">'m&aelig;ndәtәri</span>]</span><font color="#c00000">a.</font> &nbsp;命令的, 托管的&nbsp; [经]  受托者, 命令者</div>
</div>
<div style="padding: 0px 0px 0px 16px;">
<div style="padding: 0px;">  </div>
</div>
</div>
</div>
<div style="padding: 0px 0px 0px 16px;">
<div style="padding: 0px;">  </div>
</div>
<br />
（1）PROPAGATION_REQUIRED :Spring的默认的事务传播行为。必须在事务内执行，如果当前存在事务就加入当前事务，&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果 当前没有事务，就创建一个新的事务。<br />
<br />
（2）PROPAGATION_SUPPORTS:支持当前的事务，如果当前没有事务，可以以非事务方式执行。<br />
<br />
（3）PROPAGATION_MANDATORY :必须在当前事务内执行，如果当前没有事务，就直接抛出异常。<br />
<br />
（4）PROPAGATION_REQUIRES_NEW:总是新建一个事务，如果当前存在事务，就把当前事务挂起，直到新事务执行完毕<br />
<br />
（5）PROPAGATION_NOT_SUPPORTED:不能在事务环境下执行，如果当前存在事务，就把当前事务挂起。<br />
<br />
（6）PROPAGATION_NEVER:不能在事务环境下执行，如果当前存在事务，就直接抛出异常。<br />
<br />
（7）PROPAGATION_NESTED:必须在事务内执行，如果当前存在事务，则在嵌套事务内执行；如果当前没有事务，则执行与<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PROPAGATION_REQUIRED类似的操作，就是创建一个新的事务。<br />
<br />
<strong>使用编程式事务管理<br />
<br />
</strong>
          <br/>
          <span style="color:red;">
            <a href="http://justinc.javaeye.com/blog/129030#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 03 Oct 2007 22:40:42 +0800</pubDate>
        <link>http://justinc.javaeye.com/blog/129030</link>
        <guid>http://justinc.javaeye.com/blog/129030</guid>
      </item>
      <item>
        <title>Spring2.0+Struts1.2+Hibernate3.1集成</title>
        <author>justin8335</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justinc.javaeye.com">justin8335</a>&nbsp;
          链接：<a href="http://justinc.javaeye.com/blog/129028" style="color:red;">http://justinc.javaeye.com/blog/129028</a>&nbsp;
          发表时间: 2007年10月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font style="font-size: 12px;">运行环境：<font color="#0000cc">Tomcat5.0+Spring2.0+Struts1.2+Hibernate3.1</font></font></p>
<p>&nbsp;</p>
<p><font style="font-size: 12px;">注意：使用Spring1.x 与Struts集成，与Spring2.0 与Struts集成存在不同点<br />
</font></p>
<p><font style="font-size: 12px;">我门可以采用三种方式之一来整合Spring和Struts：<br />
1.Struts的Action继承Spring的ActionSupport类，并在Action中获取Spring的ApplicationContext。这</font></p>
<p><font style="font-size: 12px;">是最简单的一种整合方式，但有三个缺点：第一，Struts与Spring紧密耦合，不能改换到其他IoC容器；</font></p>
<p><font style="font-size: 12px;">第二，难以使用Spring AOP特性；第三，对于需要使用DispatchAction的Struts应用无能为力。</font></p>
<p><br />
<font style="font-size: 12px;">2.在Struts的配置文件中，以Spring的DelegatingRequestProcessor类代替Struts的RequestProcessor类</font></p>
<p><font style="font-size: 12px;">，并在Spring的配置文件中定义与Struts配置文件中&lt;action-mappings&gt;对应的bean，从而将Struts的</font></p>
<p><font style="font-size: 12px;">Action与Spring分开，并把Struts的动作置于Spring的控制之下。这种整合方式的优点是将不再依赖</font></p>
<p><font style="font-size: 12px;">Spring这个特定的IoC容器，但必须依赖Struts的RequestProcessor类。</font></p>
<p><br />
<font color="#3366ff" style="font-size: 12px;">3.通过Spring的DelegatingActionProxy类代理Struts的动作，即在Struts配置文件中，定义&lt;action-</font><font color="#3366ff" style="font-size: 12px;">mappings&gt;的type属性全部改为DelegatingActionProxy，而不是具体的类名，并在Spring配置文件中定义</font><font color="#3366ff" style="font-size: 12px;">与Struts动作映射对应的bean，从而将Struts的Action与Spring分开，并把Struts的动作置于Spring的控制之下。</font></p>
<p><font style="font-size: 12px;">无疑，这是最灵活的一种整合方式。</font></p>
<p><br />
<font style="font-size: 12px;">第一步 完善applicationContext.xml内容</font></p>
<p><font style="font-size: 12px;">1、添加事务处理。内容如下：</font></p>
<p><font style="font-size: 12px;">&nbsp;
<div class="code_title"><font>xml 代码</font></div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1"><font>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;transactionManager&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.orm.hibernate3.HibernateTransactionManager&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">local</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;customerDAOProxy&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.transaction.interceptor.TransactionProxyFactoryBean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;transactionManager&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>=</span><span class="attribute-value">&quot;transactionManager&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;target&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">local</span><span>=</span><span class="attribute-value">&quot;customerDAO&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;transactionAttributes&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;find*&quot;</span><span class="tag">&gt;</span><span>PROPAGATION_REQUIRED,readOnly</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    </font></ol>
    </div>
    <br />
    </font></p>
    <p><font style="font-size: 12px;">2、CustomerAction Bean注入事务处理。内容如下：</font></p>
    <p><font style="font-size: 12px;">&nbsp;
    <div class="code_title"><font>xml 代码</font></div>
    <div class="dp-highlighter">
    <div class="bar">&nbsp;</div>
    <ol class="dp-xml" start="1"><font>
        <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;/customer&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.ssh.struts.action.CustomerAction&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;customerDAO&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>=</span><span class="attribute-value">&quot;customerDAOProxy&quot;</span><span class="tag">/&gt;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        </font></ol>
        </div>
        <br />
        </font></p>
        <p><font style="font-size: 12px;">&nbsp;3、最终applicationContext.xml文件，内容如下：</font></p>
        <div class="code_title">xml 代码</div>
        <div class="dp-highlighter">
        <div class="bar">&nbsp;</div>
        <ol class="dp-xml" start="1">
            <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span><span class="tag">&lt;</span><span class="tag-name">beans</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;<span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://www.springframework.org/schema/beans&quot;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;<span class="attribute">xmlns:xsi</span><span>=</span><span class="attribute-value">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;<span class="attribute">xsi:schemaLocation</span><span>=&quot;http://www.springframework.org/schema/beans&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;</span></li>
            <li class="alt"><span>http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&quot;<span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;</span></li>
            <li class="alt"><span>&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.apache.commons.dbcp.BasicDataSource&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;driverClassName&quot;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;com.mysql.jdbc.Driver&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;url&quot;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;jdbc:mysql://localhost:3306/pullhand&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;username&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;root&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;password&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;815241&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;</span></li>
            <li class="alt"><span>&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.orm.hibernate3.LocalSessionFactoryBean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;hibernateProperties&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;hibernate.dialect&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.dialect.MySQLDialect&nbsp;&nbsp;</span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;mappingResources&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>com/ssh/beans/po/Customer.hbm.xml</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;</span></li>
            <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;transactionManager&quot;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;</span></li>
            <li class="alt"><span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.orm.hibernate3.HibernateTransactionManager&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">local</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;customerDAOProxy&quot;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;</span></li>
            <li class=""><span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.transaction.interceptor.TransactionProxyFactoryBean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;transactionManager&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>=</span><span class="attribute-value">&quot;transactionManager&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;target&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">local</span><span>=</span><span class="attribute-value">&quot;customerDAO&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;transactionAttributes&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;find*&quot;</span><span class="tag">&gt;</span><span>PROPAGATION_REQUIRED,readOnly</span><span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;customerDAO&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.ssh.beans.dao.CustomerDAO&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;/customer&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.ssh.struts.action.CustomerAction&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;customerDAO&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>=</span><span class="attribute-value">&quot;customerDAOProxy&quot;</span><span class="tag">/&gt;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
            <li class=""><span>&nbsp;<span class="tag">&lt;/</span><span class="tag-name">beans</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
        </ol>
        </div>
        <br />
        <p><font style="font-size: 12px;">第二步，修改CustomerAction</font></p>
        <p><font style="font-size: 12px;">最后内容如下：</font></p>
        <p>
        <div class="code_title">java 代码</div>
        <div class="dp-highlighter">
        <div class="bar">&nbsp;</div>
        <ol class="dp-j" start="1">
            <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.ssh.struts.action;&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;</span></li>
            <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.util.ArrayList;&nbsp;&nbsp;</span></span></li>
            <li class=""><span><span class="keyword">import</span><span>&nbsp;java.util.List;&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;</span></li>
            <li class=""><span><span class="keyword">import</span><span>&nbsp;javax.servlet.http.HttpServletRequest;&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span><span class="keyword">import</span><span>&nbsp;javax.servlet.http.HttpServletResponse;&nbsp;&nbsp;</span></span></li>
            <li class=""><span><span class="keyword">import</span><span>&nbsp;org.apache.struts.action.Action;&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.apache.struts.action.ActionForm;&nbsp;&nbsp;</span></span></li>
            <li class=""><span><span class="keyword">import</span><span>&nbsp;org.apache.struts.action.ActionForward;&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.apache.struts.action.ActionMapping;&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;</span></li>
            <li class="alt"><span><span class="keyword">import</span><span>&nbsp;com.ssh.beans.dao.ICustomerDAO;&nbsp;&nbsp;</span></span></li>
            <li class=""><span><span class="keyword">import</span><span>&nbsp;com.ssh.beans.po.Customer;&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;</span></li>
            <li class=""><span>&nbsp;&nbsp;</span></li>
            <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;CustomerAction&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Action&nbsp;{&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;ICustomerDAO&nbsp;customerDAO=<span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setCustomerDAO(ICustomerDAO&nbsp;customerDAO){&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="keyword">this</span><span>.customerDAO=customerDAO;&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;}&nbsp;&nbsp;</span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;</span></li>
            <li class="alt"><span>&nbsp;<span class="keyword">public</span><span>&nbsp;ActionForward&nbsp;execute(ActionMapping&nbsp;mapping,&nbsp;ActionForm&nbsp;form,&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;{&nbsp;&nbsp;</span></li>
            <li class="alt"><span>&nbsp;&nbsp;List&nbsp;list=<span class="keyword">new</span><span>&nbsp;ArrayList();&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;Customer&nbsp;customer=<span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">if</span><span>(customerDAO!=</span><span class="keyword">null</span><span>){&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;list=customerDAO.getALLCustomer();&nbsp;&nbsp;</span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i&lt;list.size();i++){&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;customer=(Customer)list.get(i);&nbsp;&nbsp;</span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;OK:&quot;</span><span>+customer.getCustName());&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
            <li class="alt"><span>&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;ERROR&nbsp;or&nbsp;NULL&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;mapping.findForward(</span><span class="string">&quot;success&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;}&nbsp;&nbsp;</span></li>
            <li class=""><span>}&nbsp;&nbsp;</span></li>
        </ol>
        </div>
        <font style="font-size: 12px;"><br />
        </font></p>
        <p><font style="font-size: 12px;">第三步 解决找不到Action问题</font></p>
        <p><font style="font-size: 12px;">初学者会经常遇到下面这个问题：</font></p>
        <p><font style="font-size: 12px;">HTTP Status 404 - Servlet action is not available</font></p>
        <p><font style="font-size: 12px;">--------------------------------------------------------------------------------</font></p>
        <p><font style="font-size: 12px;">type Status report</font></p>
        <p><font style="font-size: 12px;">message Servlet action is not available</font></p>
        <p><font style="font-size: 12px;">description The requested resource (Servlet action is not available) is not available.</font></p>
        <p><br />
        <font style="font-size: 12px;">--------------------------------------------------------------------------------</font></p>
        <p><font style="font-size: 12px;">Apache Tomcat/5.0.28<br />
        就是找不到我们的action。</font></p>
        <p><font style="font-size: 12px;">当你努力去解决这个问题时，会发现去掉applicationContext.xml下面这个&lt;property&gt;标签，一切正常：</font></p>
        <p><font style="font-size: 12px;">&nbsp;
        <div class="code_title"><font>xml 代码</font></div>
        <div class="dp-highlighter">
        <div class="bar">&nbsp;</div>
        <ol class="dp-xml" start="1"><font>
            <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;mappingResources&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;com/ssh/beans/po/Customer.hbm.xml&nbsp;&nbsp;</span></li>
            <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            <li class="alt"><span>&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
            </font></ol>
            </div>
            </font></p>
            <p><font style="font-size: 12px;">那是什么原因呢？我想大家都会首先想到下面两个问题：</font></p>
            <p><font style="font-size: 12px;">1、路径是否正确：即com/ssh/beans/po/Customer.hbm.xml的路径正确么？</font></p>
            <p><font style="font-size: 12px;">2、文件是否正确：即Customer.hbm.xml的文件内容对么？</font></p>
            <p><font style="font-size: 12px;">当你费了一身力气发现一切OK，到底什么原因？？？</font></p>
            <p><font style="font-size: 12px;">问题在于构件路径(lib)内的包重叠（提示：前提是你要保证这个问题出现之前都正常），所以你要确定</font></p>
            <p><font style="font-size: 12px;">构建路径里的包不能重复！</font></p>
            <p><font style="font-size: 12px;">建议：大家在导入包时，按照默认导入，不要把所有的包都导进工程，在操作中在把需要的jar包导进去(</font></p>
            <p><font style="font-size: 12px;">最好不要把整个liberaries导进去），这样即可以减小工程的大小，又能确保struts\spring\hibernate</font></p>
            <p><font style="font-size: 12px;">之间的包不会重叠或者被替换。</font></p>
            <font style="font-size: 12px;"><font color="#ff0000">解决办法：把lib下的hibernate-annotations.jar文件删除，重启Tomcat后即可正常运行。</font></font>
          <br/>
          <span style="color:red;">
            <a href="http://justinc.javaeye.com/blog/129028#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 03 Oct 2007 22:32:07 +0800</pubDate>
        <link>http://justinc.javaeye.com/blog/129028</link>
        <guid>http://justinc.javaeye.com/blog/129028</guid>
      </item>
      <item>
        <title>集成Spring与Hibernate</title>
        <author>justin8335</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justinc.javaeye.com">justin8335</a>&nbsp;
          链接：<a href="http://justinc.javaeye.com/blog/129023" style="color:red;">http://justinc.javaeye.com/blog/129023</a>&nbsp;
          发表时间: 2007年10月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          集成Spring与Hibernate，<br />
将dataSource与sessionFactory添加进Spring的配置文件，<br />
将Hibernate下的DAO交由Spring来管理。<br />
<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">beans</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://www.springframework.org/schema/beans&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">xmlns:xsi</span><span>=</span><span class="attribute-value">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">xsi:schemaLocation</span><span>=</span><span class="attribute-value">&quot;http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.apache.commons.dbcp.BasicDataSource&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;driverClassName&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;com.mysql.jdbc.Driver&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;url&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;jdbc:mysql://localhost:3306/test&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;username&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;root&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;password&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;admin&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.springframework.orm.hibernate3.LocalSessionFactoryBean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>=</span><span class="attribute-value">&quot;dataSource&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;hibernateProperties&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">prop</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;hibernate.dialect&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.dialect.MySQLDialect&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">prop</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">props</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;mappingResources&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>org/justin/vo/Login.hbm.xml</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;loginDAO&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;org.justin.dao.impl.LoginDAO&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">ref</span><span>&nbsp;</span><span class="attribute">bean</span><span>=</span><span class="attribute-value">&quot;sessionFactory&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
在Spring提供的HibernateDaoSupprot超类中，如果注入SessionFactory，HibernateDaoSupport就会自动生成HibernateTemplate对象，HibernateTemplate是线程安全的。<br />
<br />
让Hibernate的DAO类继承Spring的HibernateDaoSupport类，这样DAO类就可以通过getHibernateTemplate()方法<br />
获得一个HibernateTemplate对象，HibernateTemplate对象本身包含了SessionFactory的引用，因此HibernateTemplate对象可以完成所有的Hibernate操作。<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;LoginDAO&nbsp;</span><span class="keyword">extends</span><span>&nbsp;HibernateDaoSupport&nbsp;</span><span class="keyword">implements</span><span>&nbsp;ILoginDAO&nbsp;&nbsp;</span></span></li>
</ol>
</div>
通过HibernateTemplate提供的方法实现CRUD操作<br />
（1）Serializable save(Object entity)<br />
<br />
（2）Object get(Class entity , Serializable id)<br />
<br />
（3）Object load(String entityName,Serializable id)<br />
<br />
（4）void update(Objecet entity)<br />
<br />
（5）void delete(Objecet entity)<br />
<br />
<strong>HibernateTemplate实现分页处理<br />
<div class="code_title"><strong>java 代码</strong></div>
<div class="dp-highlighter">
<ol class="dp-j" start="1">
    <li class="alt"><span><span><strong>&nbsp;</strong></span><span class="keyword"><strong>public</strong></span><span><strong>&nbsp;List&nbsp;findByPagination(Login&nbsp;login){&nbsp;&nbsp;</strong></span></span></li>
    <li class=""><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list&nbsp;=(List)<span class="keyword">this</span><span>.getHibernateTemplate().execute(</span><span class="keyword">new</span><span>&nbsp;HibernateCallback(){&nbsp;&nbsp;</span></strong></span></li>
    <li class="alt"><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;Object&nbsp;doInHibernate(Session&nbsp;session)</span><span class="keyword">throws</span><span>&nbsp;HibernateException,SQLException&nbsp;&nbsp;</span></strong></span></li>
    <li class=""><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</strong></span></li>
    <li class="alt"><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criteria&nbsp;criteria&nbsp;=&nbsp;session.createCriteria(Login.<span class="keyword">class</span><span>)&nbsp;&nbsp;</span></strong></span></li>
    <li class=""><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setFirstResult(<span class="number">0</span><span>)&nbsp;&nbsp;</span></strong></span></li>
    <li class="alt"><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setMaxResults(<span class="number">10</span><span>);&nbsp;&nbsp;</span></strong></span></li>
    <li class=""><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong></span></li>
    <li class="alt"><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;criteria.list();&nbsp;&nbsp;</span></strong></span></li>
    <li class=""><span><span class="comment"><strong>&nbsp; /* 也可以使用Query接口 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br />
    </strong></span></span></li>
    <li class=""><span><span class="comment"><strong>Query&nbsp;query&nbsp;=&nbsp;session.createQuery(&quot;From&nbsp;Login&nbsp;as&nbsp;L&quot;)</strong></span><strong>&nbsp;</strong></span></li>
    <li class="alt"><span><span class="comment"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setFirstResult(0).setMaxResults(3);</strong></span><strong>&nbsp;</strong></span></li>
    <li class=""><span><span class="comment"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong></span><strong>&nbsp;</strong></span></li>
    <li class="alt"><span><span class="comment"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;query.list();*/</strong></span><span><strong>&nbsp;&nbsp;</strong></span></span></li>
    <li class=""><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</strong></span></li>
    <li class="alt"><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;</strong></span></li>
    <li class=""><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong></span></li>
    <li class="alt"><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;list&nbsp;;&nbsp;&nbsp;</span></strong></span></li>
    <li class=""><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</strong></span></li>
</ol>
</div>
<br />
</strong>HibernateTemplate提供的Object <span><span>execute（</span></span><span><span>HibernateCallback action</span></span><span><span>）</span></span><span><span>方法允许执行任何Hibernate操作<br />
在doInHibernate中可以使用任意的Hibernate接口，如Query，Criteria等<br />
<br />
其中</span></span><span><span>HibernateCallback是一个回调接口！</span></span>
          <br/>
          <span style="color:red;">
            <a href="http://justinc.javaeye.com/blog/129023#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 03 Oct 2007 22:07:50 +0800</pubDate>
        <link>http://justinc.javaeye.com/blog/129023</link>
        <guid>http://justinc.javaeye.com/blog/129023</guid>
      </item>
      <item>
        <title>常见SSH的架构设计策略（二）</title>
        <author>justin8335</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justinc.javaeye.com">justin8335</a>&nbsp;
          链接：<a href="http://justinc.javaeye.com/blog/128809" style="color:red;">http://justinc.javaeye.com/blog/128809</a>&nbsp;
          发表时间: 2007年10月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Rich Domain Object模式
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">在这种模式下，Domain Object不再是单纯的数据载体，Domain Object包含了相关的业务逻辑方法。例如News类包含了addNewsView 方法等。</p>
<p class="af5">下面是修改后的News类的源代码：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;News&nbsp;</span><span class="keyword">extends</span><span>&nbsp;BaseObject &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//此处省略了其他的属性 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//此处省略了属性对应的setter和getter方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//增加新闻回复的业务逻辑方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;NewsReview&nbsp;addNewsReview(String&nbsp;content) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//以默认构造器创建新闻回复实例 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewsReview&nbsp;review&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;NewsReview(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置回复内容 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;review.setContent(content); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置回复的发布日期 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;review.setPostDate(</span><span class="keyword">new</span><span>&nbsp;Date()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置回复的最后修改日期 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;review.setLastModifyDate(</span><span class="keyword">new</span><span>&nbsp;Date()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置回复与消息的关联 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;review.setNews(</span><span class="keyword">this</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;review; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//此处省略了重写的hashCode，equals等方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p class="af6">在上面的Domain Object中，包含了相应的业务逻辑方法，这是一种更完备的建模方法。</p>
<p class="af8" style="TEXT-INDENT: 21.05pt">注意：不要在Domain Object中对消息回复完成持久化，如需完成持久化，必须调用DAO组件；一旦调用DAO组件，将造成DAO对象和Domain Object的双向依赖；另外，Domain Object中的业务逻辑方法还需要在业务逻辑组件中代理，才能真正实现持久化。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">在上面的业务逻辑方法中，并没有进行持久化。如果抛开DAO层，这种Domain Object也可以独立测试，只是没有进行持久化。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">DAO对象是变化最小的对象，它们都是进行基本的CRUD操作，在两种模型下的DAO对象没有变化。</p>
<p class="af5">另外还需要对业务逻辑对象进行改写，虽然Domain Object包含了基本业务逻辑方法，但业务逻辑对象还需代理这些方法，修改后业务逻辑对象的代码如下：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;FacadeManagerImpl&nbsp;</span><span class="keyword">implements</span><span>&nbsp;FacadeManager &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//业务逻辑对象依赖的DAO对象 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;CategoryDAO&nbsp;categoryDAO; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;NewsDAO&nbsp;newsDAO; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;NewsReviewDAO&nbsp;newsReviewDAO; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;UserDAO&nbsp;userDAO; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//...此处还应该增加依赖注入DAO对象必需的setter方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//...此处还应该增加其他业务逻辑方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//下面是增加新闻回复的业务方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;NewsReview&nbsp;addNewsReview(Long&nbsp;newsId&nbsp;,&nbsp;String&nbsp;content) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//根据新闻id加载新闻 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;News&nbsp;news&nbsp;=&nbsp;newsDao.getNews(newsId); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//通过News的业务方法添加回复 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewsReview&nbsp;review&nbsp;=&nbsp;news.addNewsReview(content); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//此处必须显示持久化消息回复 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newsReviewDAO.saveNewsReview(review); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;review; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p class="af6">在Rich Domain Object的模型中，addNewsReview方法将放在News类中实现，而业务逻辑对象仅对该方法进行简单的代理，执行必要的持久化操作。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.05pt">在这里存在一个问题：业务逻辑方法很多，哪些业务逻辑方法应该放在Domain Object对象中实现，而哪些业务逻辑方法完全由业务逻辑对象实现呢？Rod Johnson认为，可重用度高，与Domain Object密切相关的业务方法应放在Domain Object对象中实现。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">业务逻辑方法是否需要由Domain Object实现的标准，从一定程序上说明了采用Rich Domain Object模型的原因。由于某些业务方法只是专一地属于某个Domain Object，因此将这些方法由Domain Object实现，能提供更好的软件复用，能更好地体现面向对象的封装性。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">Rich Domain Object模型的各组件之间关系大致如图8.2所示（贫血模式的组件关系图与此类似）。</p>
<p align="center" style="MARGIN: 7.8pt 0cm 4.65pt"><img src="http://book.csdn.net/BookFiles/403/img/image001.jpg" alt="" /></p>
<p align="center" style="MARGIN: 4.65pt 0cm 7.8pt">图8.2&nbsp; Rich Domain Object的组件关系图</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.05pt">这种Rich Domain Object模型主要的问题是业务逻辑对象比较复杂，由于业务逻辑对象需要正面封装所有的DAO对象，因而难免有大量的DAO方法（基本的CRUD）需要业务逻辑对象封装。业务逻辑对象封装DAO方法主要基于如下考虑：</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">&mdash;&nbsp; DAO对象不应该暴露为Web层。</p>
<p class="ab" style="MARGIN-LEFT: 33.8pt; TEXT-INDENT: -12.35pt">&mdash;&nbsp; DAO对象的DAO方法必须增加事务控制代码，而事务控制则放在业务逻辑层完成。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.05pt">为了简化业务逻辑对象的开发，Rich Domain Object模型可以有如下两个方向的改变：</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt"><font color="#3366ff">&mdash; 合并业务逻辑对象与DAO对象。</font></p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt"><font color="#3366ff">&mdash; 合并业务逻辑对象和Domain Object。</font></p>
<p class="5" style="TEXT-INDENT: 21.45pt">1．合并业务逻辑对象与DAO对象</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">在这种模型下DAO对象不仅包含了各种CRUD方法，而且还包含各种业务逻辑方法。此时的DAO对象，已经完成了业务逻辑对象所有任务，变成了DAO对象和业务逻辑对象混合体。此时，业务逻辑对象依赖Domain Object，既提供基本的CRUD方法，也提供相应的业务逻辑方法。</p>
<p class="af5">下面是这种模式的代码（Domain Object的实现与前面的Rich Domain Object模式一样，此处不再给出）：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">//&nbsp;NewsServiceHibernate继承HibernateDaoSupport，实现NewsService接口 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;NewsServiceHibernate&nbsp;</span><span class="keyword">extends</span><span>&nbsp;HibernateDaoSupport&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">implements</span><span>&nbsp;NewsService &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//此处添加NewsService对象依赖的DAO对象，以及对应的setter方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//根据主键加载消息 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;News&nbsp;getNews(Long&nbsp;id)&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;News&nbsp;news&nbsp;=&nbsp;(News)&nbsp;getHibernateTemplate().get(News.</span><span class="keyword">class</span><span>,&nbsp;id); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(news&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;ObjectRetrievalFailureException(News.</span><span class="keyword">class</span><span>,&nbsp;id);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;news; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//保存新的消息 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;saveNews(News&nbsp;news)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getHibernateTemplate().saveOrUpdate(news); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//根据主键删除消息 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;removeNews(Long&nbsp;id) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getHibernateTemplate().delete(getNews(id)); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//查找全部的消息 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;List&nbsp;findAll() &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getHibernateTemplate().find(</span><span class="string">&quot;from&nbsp;News&quot;</span><span>)); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//下面是增加新闻回复的业务方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;NewsReview&nbsp;addNewsReview(Long&nbsp;newsId&nbsp;,&nbsp;String&nbsp;content) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//根据新闻id加载新闻 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;News&nbsp;news&nbsp;=&nbsp;newsDao.getNews(newsId); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//通过News的业务方法添加回复 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewsReview&nbsp;review&nbsp;=&nbsp;news.addNewsReview(content); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//此处必须显示持久化消息回复 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newsReviewService.saveNewsReview(review); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;review; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p class="af6">正如上面见到的，DAO对象和业务逻辑对象之间容易形成交叉依赖（可能某个业务逻辑方法的实现，必须依赖于原来的DAO对象）。当DAO对象被取消后，业务逻辑对象取代了DAO对象，因此变成了一个业务逻辑对象依赖多个业务逻辑对象。而每个业务逻辑对象都可能包含需要多个DAO对象协作的业务方法，从而导致业务逻辑对象之间的交叉依赖。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">业务逻辑对象和DAO对象合并后的组件关系如图8.3所示。</p>
<p align="center" style="MARGIN: 7.8pt 0cm 4.65pt"><img src="http://book.csdn.net/BookFiles/403/img/image002.jpg" alt="" /></p>
<p align="center" style="MARGIN: 4.65pt 0cm 7.8pt">图8.3&nbsp; 合并DAO对象和业务逻辑对象</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">这种模型也导致了DAO方法和业务逻辑方法混合在一起，显得职责不够单一，软件分层结构不够清晰。此外，使业务逻辑对象之间交叉依赖，容易产生混乱，未能做到彻底的简化。</p>
<p class="5" style="TEXT-INDENT: 21.45pt">2．合并业务逻辑对象和Domain Object</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">在这种模型下，所有的业务逻辑都应该被放在Domain Object里面，而此时的业务逻辑层不再是传统的业务逻辑层，它仅仅封装了事务和少量逻辑，完全无需DAO对象的支持。而Domain Object依赖于DAO对象执行持久化操作，此处Domain Object和DAO对象形成双向依赖，这种设计在某些地方也被称为<font color="#3366ff">充血模式</font>，但有时会带来相当大的危险。</p>
<p class="af5">在这种设计模式下，几乎不再需要业务逻辑层，而Domain Object则依赖DAO对象完成持久化操作，下面是在这种模式下的News类代码：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;News&nbsp;</span><span class="keyword">extends</span><span>&nbsp;BaseObject &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//此处省略了其他的属性。 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//此处省略了属性对应的setter和getter方法 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//增加新闻回复的业务逻辑方法 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;NewsReview&nbsp;addNewsReview(String&nbsp;content) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//以默认构造器创建新闻回复实例 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewsReview&nbsp;review&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;NewsReview(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置回复内容 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;review.setContent(content); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置回复的发布日期 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;review.setPostDate(</span><span class="keyword">new</span><span>&nbsp;Date()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置回复的最后修改日期 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;review.setLastModifyDate(</span><span class="keyword">new</span><span>&nbsp;Date()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置回复与消息的关联 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;review.setNews(</span><span class="keyword">this</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//直接调用newsReviewsDao完成消息回复的持久化。 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newsReviewsDao.save(review); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;review; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//此处省略了重写的hashCode，equals等方法 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p class="af6">从上面代码中可以看到，由于Domain Object必须使用DAO对象完成持久化，因此Domain Object必须接收IOC容器的注入，而Domain Object获取容器注入的DAO对象，通过DAO对象完成持久化操作。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">合并业务逻辑对象和Domain Object后各组件的关系如图8.4所示。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">这种模型的优点是：业务逻辑对象非常简单，只提供简单的事务操作，业务逻辑对象无须依赖于DAO对象。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">但这种模型的缺点也是非常明显的：</p>
<p class="ab" style="MARGIN-LEFT: 33.8pt; TEXT-INDENT: -12.35pt">&mdash;&nbsp; DAO对象和Domain Object形成了双向依赖，其复杂的双向依赖会导致很多潜在的问题。 </p>
<p class="ab" style="MARGIN-LEFT: 33.8pt; TEXT-INDENT: -12.35pt">&mdash; 业务逻辑层和Domain层的逻辑混淆不清，在实际项目中，极容易导致架构混乱。</p>
<p class="ab" style="MARGIN-LEFT: 33.8pt; TEXT-INDENT: -12.35pt">&mdash; 由于使用业务逻辑对象提供事务封装特性，业务逻辑层必须对所有的Domain Object的逻辑提供相应的事务封装，因此业务逻辑对象必须重新定义Domain Object实现的业务逻辑，其工作相当烦琐。</p>
<p align="center" style="MARGIN: 7.8pt 0cm 4.65pt"><img src="http://book.csdn.net/BookFiles/403/img/image003.jpg" alt="" /></p>
<p align="center" style="MARGIN: 4.65pt 0cm 7.8pt">图8.4&nbsp; 合并业务逻辑组件和Doamin Object</p>
<h3>8.4.3&nbsp; 抛弃业务逻辑层</h3>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">在Rich Domain Object模型的各种变化中，虽然努力简化业务逻辑对象，但业务逻辑对象依然存在，依然使用业务逻辑对象正面封装所有的业务请求。下面介绍更彻底的简化即，彻底放弃业务逻辑层。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">抛弃业务逻辑层也有两种形式：</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">&mdash;&nbsp; Domain Object彻底取代业务逻辑对象。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">&mdash; 由控制器直接调用DAO对象。</p>
<p class="5" style="TEXT-INDENT: 21.45pt">1．Domain Object完全取代业务逻辑对象</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">这种设计模式是充血模式更加激进的演化。由于在充血模式中业务逻辑对象的作用仅仅只提供事务封装，业务逻辑对象存在的必要性不是很大，因此考虑对Domain Object的业务逻辑方法增加事务管理，而Web层的控制器则直接依赖于Domain Object。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">这种模型更加简化，使Domain Object与DAO对象形成双向依赖，而Web层的控制器直接调用Domain Object的业务逻辑方法。这种模型在有些地方也被称为<font color="#3366ff">胀血模式</font>。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">这种模型的优点是：<font color="#3366ff">分层少，代码实现简单</font>。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">但这种模型的缺点也很明显：</p>
<p class="ab" style="MARGIN-LEFT: 33.8pt; TEXT-INDENT: -12.35pt">&mdash; 业务逻辑对象的所有业务逻辑都将在Domain Object中实现，势必引起Domain Object的混乱。</p>
<p class="ab" style="MARGIN-LEFT: 33.8pt; TEXT-INDENT: -12.35pt">&mdash;&nbsp; Domain Object必须向Web层直接暴露，可能导致意想不到的问题。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">这种模型与充血模式的缺点相同：Domain Object必须配置在Spring容器中，接受Spring容器的依赖注入。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.05pt">在这种架构模型下，Domain Object相当不稳定。如果业务逻辑需要改变，Domain Object也需要发生改变，而DAO对象与Domain Object形成双向依赖，这将导致从底层的Domain Object和DAO对象的修改，使这种架构模式的分层完全失去意义。各层之间以强耦合方式组合在一起，各层对象互相依赖，牵一发而动全身，几乎是最差的一种策略。</p>
<p class="5" style="TEXT-INDENT: 21.45pt">2．控制器完成业务逻辑</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">在这种模型里，控制器直接调用DAO对象的CRUD方法，通过调用基本的CRUD方法，完成对应的业务逻辑方法。这种模型下，业务逻辑对象的功能由控制器完成。事务则推迟到控制器中完成，因此对控制器的execute方法增加事务控制即可。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">对于基本的CRUD操作，控制器可直接调用DAO对象的方法，省略了业务逻辑对象的封装，这就是这种模型的最大优势。对于业务逻辑简单（当业务逻辑只是大量的CRUD操作时）的项目，使用这种模型也未尝不是一种好的选择。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">但这种模型将导致控制变得臃肿，因为每个控制器除了包含原有的execute方法之外，还必须包含所需要的业务逻辑方法的实现。极大地省略了业务逻辑层的开发，避免了业务逻辑对象不得不大量封装基本的CRUD方法的弊端。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">这种模型也有其缺点：</p>
<p class="ab" style="MARGIN-LEFT: 33.8pt; TEXT-INDENT: -12.35pt">&mdash; 因为没有业务逻辑层，对于那些需要多个DAO参与的复杂业务逻辑，在控制器中必须重复实现，其效率低，也不利于软件重用。 </p>
<p class="ab" style="MARGIN-LEFT: 33.8pt; TEXT-INDENT: -12.35pt">&mdash;&nbsp; Web层的功能不再清晰，人为复杂化。Web层不仅负责实现控制器逻辑，还需要完成业务逻辑的实现，因此必须精确控制何时调用DAO方法控制持久化。</p>
<p class="ab" style="MARGIN-LEFT: 33.8pt; TEXT-INDENT: -12.35pt">&mdash; 扩大了事务的影响范围。大部分情况下，只有业务逻辑方法需要增加事务控制，而execute方法无须增加事务控制。但如果execute方法直接调用了DAO对象的CRUD方法，则会导致这些方法不在事务环境下执行。为了让数据库访问都在事务环境下进行，因此不得不将事务范围扩大到整个execute方法。</p>
<h2>本章小结</h2>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">本章首先介绍了笔者在架构设计方面一些经验，从企业应用开发面临的困难讲起，并讲解了面对这些困难时应该采用何种应对策略。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.05pt">其次介绍了常用的代理模式的使用，并深入介绍了由此衍生出来的Spring AOP框架。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">最后重点介绍了贫血模型、Rich Domain Object模型、以及几种简化的模型，并分别分析了几种模型各自的优缺点。</p>
<!-- page -->
          <br/>
          <span style="color:red;">
            <a href="http://justinc.javaeye.com/blog/128809#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 03 Oct 2007 00:26:35 +0800</pubDate>
        <link>http://justinc.javaeye.com/blog/128809</link>
        <guid>http://justinc.javaeye.com/blog/128809</guid>
      </item>
      <item>
        <title>常见SSH的架构设计策略（一）</title>
        <author>justin8335</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justinc.javaeye.com">justin8335</a>&nbsp;
          链接：<a href="http://justinc.javaeye.com/blog/128806" style="color:red;">http://justinc.javaeye.com/blog/128806</a>&nbsp;
          发表时间: 2007年10月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>（转载自）<a href="http://book.csdn.net/bookfiles/403">轻量级J2EE企业应用实战&mdash;&mdash;Struts+Spring+Hibernate整合开发</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 李刚</p>
<p>常见的架构设计策略 </p>
<p>目前流行的轻量级J2EE应用的架构比较一致，采用的技术也比较一致，通常使用Spring作为核心，向上整合MVC框架，向下整合ORM框架。使用Spring的IOC容器来管理各组件之间的依赖关系时，Spring的声明事务将负责业务逻辑层对象方法的事务管理。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">但在固定的技术组合上，依然可能存在小的变化。下面依次讨论可能存在的架构策略。</p>
<h3>8.4.1&nbsp; 贫血模式</h3>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">贫血模式是最常用的设计架构，也是最容易理解的架构。为了让读者通过本书顺利进入轻量级J2EE企业应用开发，本书的第9章及第10章的范例都将采用这种简单的架构模式。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">所谓贫血，指Domain Object只是单纯的数据类，不包含业务逻辑方法，即每个Domain Object类只包含基本的setter和getter方法。所有的业务逻辑都由业务逻辑组件实现，这种Domain Object就是所谓的贫血的Domain Object，采用这种Domain Object的架构即所谓的贫血模式。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">下面以第9章的消息发布系统的部分代码为例，介绍贫血模式。</p>
<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">在贫血模式里，所有的Domain Object只是单纯的数据类，只包含每个属性的setter和getter方法，如下是两个持久化类。</p>
<p class="af5">第一个Domain Object是消息，其代码如下：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;News&nbsp;</span><span class="keyword">extends</span><span>&nbsp;BaseObject&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Serializable &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//主键 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Long&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//消息标题 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;title; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//消息内容 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;content; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//消息的发布时间 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Date&nbsp;postDate; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//消息的最后修改时间 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Date&nbsp;lastModifyDate; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//消息所属分类 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Category&nbsp;category; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//消息对应的消息回复 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Set&nbsp;newsReviews; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//无参数的构造器 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;News()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//消息回复对应的getter方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Set&nbsp;getNewsReviews()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;newsReviews; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//消息回复对应的setter方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setNewsReviews(Set&nbsp;newsReviews)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.newsReviews&nbsp;=&nbsp;newsReviews; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//消息分类对应的getter方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""