<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>NicholasBugs</title>
    <description></description>
    <link>http://nicholasbugs.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>TDD，重构，原来你们并不遥远</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/227457" style="color:red;">http://nicholasbugs.javaeye.com/blog/227457</a>&nbsp;
          发表时间: 2008年08月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前阵子开始了一个先的项目，是公司内部的一个项目管理系统，我主要负责系统的设计和技术支持工作，第一次拥有这么大的开发自由度（对日公司里对你的开发规程限制得比较多），我当然不会放过实践一些软件开发的概念诸如TDD,持续重构等等。在看了这篇文章“TDD让我轻轻得靠近你”以后，让我下定决心在项目中实施TDD的。（待续）
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/227457#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' 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/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 13 Aug 2008 09:30:51 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/227457</link>
        <guid>http://nicholasbugs.javaeye.com/blog/227457</guid>
      </item>
          <item>
        <title>Spring事务传播机制</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/226901" style="color:red;">http://nicholasbugs.javaeye.com/blog/226901</a>&nbsp;
          发表时间: 2008年08月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          PROPAGATION_REQUIRES_NEW starts a new, independent "inner" transaction for the given scope. This transaction will be committed or rolled back completely independent from the outer transaction, having its own isolation scope, its own set of locks, etc. The outer transaction will get suspended at the beginning of the inner one, and resumed once the inner one has completed.<br /><br /><span style="color: red">PROPAGATION_REQUIRES_NEW</span>会在当前运行的范围内创建一个全新的内部事务，这个的事务会独立地被提交或回滚（完全独立于外部事务），它拥有自己的隔离级别，以及锁等等。当内部事务被执行时，外部事务会被挂起，知道内部事务结束时才会继续执行。<br /><br />Such independent inner transactions are for example used for id generation through manual sequences, where the access to the sequence table should happen in its own transactions, to keep the lock there as short as possible. The goal there is to avoid tying the sequence locks to the (potentially much longer running) outer transaction, with the sequence lock not getting released before completion of the outer transaction.<br />这种独立的内部事务会被诸如从序列生成ID的应用中，从序列取得id的动作应该发生在自己的事务内部，并且保持对这个sequence表的锁的时间越短越好。这么做是为了避免在获得ID以后可能仍然在很长时间内持有这个sequence表的锁（外部事务仍在运行中）。<br /><br />PROPAGATION_NESTED on the other hand starts a "nested" transaction, which is a true subtransaction of the existing one. What will happen is that a savepoint will be taken at the start of the nested transaction. íf the nested transaction fails, we will roll back to that savepoint. The nested transaction is part of of the outer transaction, so it will only be committed at the end of of the outer transaction.<br /><span style="color: red">PROPAGATION_NESTED</span>启动了一次嵌套的事务（一个当前事务的子事务），在内部嵌套事务开始时，会保留一个保存点（savepoint），如果内部嵌套事务失败，将会回滚到savepoint处，内部嵌套事务是外部事务的一部分，所以只有在外部事务完成时才会被提交。<br /><br />Nested transactions essentially allow to try some execution subpaths as subtransactions: rolling back to the state at the beginning of the failed subpath, continuing with another subpath or with the main execution path there - <strong><span style="color: blue">all within one isolated transaction</span></strong>, and not losing any previous work done within the outer transaction.<br />嵌套事务可以满足子事务“多路执行”的需求：回滚到失败的内部嵌套事务开始的地方，然后执行另外的一个内部嵌套事务，或者继续执行主事务-<strong><span style="color: blue">上面提及的事务都是独立的</span></strong>，不会丢失外部事务所作的修改。<br /><br />For example, consider parsing a very large input file consisting of account transfer blocks: The entire file should essentially be parsed within one transaction, with one single commit at the end. But if a block fails, its transfers need to be rolled back, writing a failure marker somewhere. You could either start over the entire transaction every time a block fails, remembering which blocks to skip - or you mark each block as a nested transaction, only rolling back that specific set of operations, keeping the previous work of the outer transaction. The latter is of course much more efficient, in particular when a block at the end of the file fails. <br /><br />例如，分块传输一个很大的文件，整个文件的传输应该放在一个事务内部，在文件传输完成后提交事务。如果一个文件块传输失败了，就需要在某个地方写一个失败标记，然后重新传这个文件块，你可以在每次传输一个文件块失败时重新开始事务，然后记住那些块已经成功传输了，忽略即可-或者你可以把每个文件块的传输作为一个内部嵌套事务，只回滚失败的事务，保存前面事务的更改结果，当然这种方法要有效得多，想像一个最后一个文件块出错的情形。
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/226901#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 12 Aug 2008 10:36:07 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/226901</link>
        <guid>http://nicholasbugs.javaeye.com/blog/226901</guid>
      </item>
          <item>
        <title>Hibernate Annotation的 *ToOne默认的FetchType是EAGER的</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/218551" style="color:red;">http://nicholasbugs.javaeye.com/blog/218551</a>&nbsp;
          发表时间: 2008年07月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Hibernate Annotation的 *ToOne默认的FetchType是EAGER的<br /><br />public class Entry{<br />...<br />@ManyToOne(targetEntity = User.class, fetch = FetchType.LAZY)<br />如果不加“fetch = FetchType.LAZY” 就会生成一个连表sql.<br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * lazy load this property by proxy<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; @JoinColumn(name="USERID")<br />&nbsp;&nbsp;&nbsp; @LazyToOne(LazyToOneOption.NO_PROXY)<br />&nbsp;&nbsp;&nbsp; private User author;<br />...<br />}
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/218551#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' 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/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Jul 2008 13:50:58 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/218551</link>
        <guid>http://nicholasbugs.javaeye.com/blog/218551</guid>
      </item>
          <item>
        <title> hibernate.AssertionFailure</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/210102" style="color:red;">http://nicholasbugs.javaeye.com/blog/210102</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          hibernate.AssertionFailure: collection was not processed by flush()<br />在把Compass2.0整合到应用程序中时遇到这样的错误。<br />其中Compass用来索引domain A, B.<br />A和B是一对多关系。<br />如下<pre name="code" class="java">
Class A{
...  
}

Class B{
 private A a;
 ...
}
//在A,B的hbm文件中通过many-to-one 和 one-to-many关联。
</pre><br />在没有加入Compass之前，对这两个domain的查找，更新没有任何问题。<br />在加入Compass之后，对这两个dimain进行索引，然后查询，也没有问题。<br />对domain A更新也没有问题。<br />但是当对父A添加一个子B时，就出现了文章开头的异常情形。<br />下面的链接里也出现了这样的问题，不过他用的是 hibernate search <br /><a href="http://forum.springframework.org/showthread.php?t=49058" target="_blank">http://forum.springframework.org/showthread.php?t=49058</a><br />再好好研究下什么原因。谁如果遇到类似的情形，麻烦把解决方案留下，<img src="/images/smiles/icon_biggrin.gif"/><br /><br />下面贴下完整的stackTrace<br /><ul><br />org.hibernate.AssertionFailure: collection was not processed by flush()<br />	at org.hibernate.engine.CollectionEntry.postFlush(CollectionEntry.java:183)<br />	at org.hibernate.event.def.AbstractFlushingEventListener.postFlush(AbstractFlushingEventListener.java:328)<br />	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:28)<br />	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)<br />	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:353)<br />	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)<br />	at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:586)<br />	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:564)<br />	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:537)<br />	at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(TransactionAspectSupport.java:267)<br />	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)<br />	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:169)<br />	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:169)<br />	at $Proxy22.saveOrUpdateComment(Unknown Source)<br />	at com.gln.bloger.action.CommentAction.post(CommentAction.java:54)<br />	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br />	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br />	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br />	at java.lang.reflect.Method.invoke(Method.java:585)<br />	at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:269)<br />	at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)<br />	at com.gln.bloger.action.BaseAction.execute(BaseAction.java:72)<br />	at com.gln.bloger.action.GuestBaseAction.execute(GuestBaseAction.java:71)<br />	at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:106)<br />	at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)<br />	at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)<br />	at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)<br />	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)<br />	at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)<br />	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)<br />	at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)<br />	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)<br />	at com.gln.bloger.servlet.BlogActionServlet.process(BlogActionServlet.java:74)<br />	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)<br />	at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)<br />	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)<br />	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)<br />	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)<br />	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)<br />	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)<br />	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)<br />	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)<br />	at org.tuckey.web.filters.urlrewrite.RewrittenUrl.doRewrite(RewrittenUrl.java:176)<br />	at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:728)<br />	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)<br />	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)<br />	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)<br />	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)<br />	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)<br />	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)<br />	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)<br />	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)<br />	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)<br />	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)<br />	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)<br />	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)<br />	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)<br />	at java.lang.Thread.run(Thread.java:595)<br />org.hibernate.AssertionFailure: collection was not processed by flush()<br />	at org.hibernate.engine.CollectionEntry.postFlush(CollectionEntry.java:183)<br />	at org.hibernate.event.def.AbstractFlushingEventListener.postFlush(AbstractFlushingEventListener.java:328)<br />	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:28)<br />	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)<br />	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:353)<br />	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)<br />	at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:586)<br />	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:564)<br />	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:537)<br />	at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(TransactionAspectSupport.java:267)<br />	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)<br />	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:169)<br />	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:169)<br />	at $Proxy22.saveOrUpdateComment(Unknown Source)<br />	at com.gln.bloger.action.CommentAction.post(CommentAction.java:54)<br />	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br />	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br />	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br />	at java.lang.reflect.Method.invoke(Method.java:585)<br />	at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:269)<br />	at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)<br />	at com.gln.bloger.action.BaseAction.execute(BaseAction.java:72)<br />	at com.gln.bloger.action.GuestBaseAction.execute(GuestBaseAction.java:71)<br />	at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:106)<br />	at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)<br />	at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)<br />	at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)<br />	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)<br />	at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)<br />	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)<br />	at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)<br />	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)<br />	at com.gln.bloger.servlet.BlogActionServlet.process(BlogActionServlet.java:74)<br />	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)<br />	at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)<br />	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)<br />	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)<br />	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)<br />	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)<br />	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)<br />	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)<br />	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)<br />	at org.tuckey.web.filters.urlrewrite.RewrittenUrl.doRewrite(RewrittenUrl.java:176)<br />	at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:728)<br />	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)<br />	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)<br />	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)<br />	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)<br />	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)<br />	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)<br />	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)<br />	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)<br />	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)<br />	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)<br />	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)<br />	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)<br />	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)<br />	at java.lang.Thread.run(Thread.java:595)<br /></ul>
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/210102#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' 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>Tue, 01 Jul 2008 11:59:34 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/210102</link>
        <guid>http://nicholasbugs.javaeye.com/blog/210102</guid>
      </item>
          <item>
        <title>ecplise3.4 ganymede 发布了</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/209752" style="color:red;">http://nicholasbugs.javaeye.com/blog/209752</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          新特性就不说了，javaeye新闻里有，可以直接去ecplise网站上去下，如果懒得去国外网，下面这个链接也可以，我放上去的<img src="/images/smiles/icon_biggrin.gif"/><br />http://www.fs2you.com/files/15b12835-466a-11dd-9a6a-0014221f4662/
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/209752#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 30 Jun 2008 14:14:01 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/209752</link>
        <guid>http://nicholasbugs.javaeye.com/blog/209752</guid>
      </item>
          <item>
        <title>sourceforge上不去了，什么原因？</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/208352" style="color:red;">http://nicholasbugs.javaeye.com/blog/208352</a>&nbsp;
          发表时间: 2008年06月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天想去下载个最新的hibernate-core 下来，结果半天连不上了，在公司在家里都上不了。<br />为什么？？难道又被禁了？<img src="/images/smiles/icon_cry.gif"/><br />update:<br />今天再连了一遍：<br />收到如下错误信息：<br /><div class="quote_title">引用</div><div class="quote_div">The following error was encountered:<br /><br />&nbsp;&nbsp;&nbsp; * Connection to 216.34.181.60 Failed </div><br />然后查这个IP：<br /><div class="quote_title">引用</div><div class="quote_div"><br />您查询的IP:216.34.181.60<br /><br />&nbsp;&nbsp;&nbsp; * 本站主数据：美国<br />&nbsp;&nbsp;&nbsp; * 查询结果2：美国<br />&nbsp;&nbsp;&nbsp; * 查询结果3：美国 加州<br /><br /></div><br />难道错怪The G F W 了？
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/208352#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 26 Jun 2008 20:19:42 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/208352</link>
        <guid>http://nicholasbugs.javaeye.com/blog/208352</guid>
      </item>
          <item>
        <title>Compass的SearchableReference</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/207924" style="color:red;">http://nicholasbugs.javaeye.com/blog/207924</a>&nbsp;
          发表时间: 2008年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">Class Entry
@Searchable(alias="entry")
{
@SearchableId
String id...}
@Searchable(alias="comment")
Class Comment
{@SearchableId
String id
...
@SearchableReference(refAlias="entry")
private Entry entry;
}
</pre><br />如上，按照我的理解，当检索到一个Comment对象时，Compass会把这条Comment对应的Entry也取出来。因为在SearchableReference的doc中有这么一句<br /><div class="quote_title">引用</div><div class="quote_div">A searchable reference is a class field/property that reference another class, and the relationship need to be stored by Compass so it can be traversed when getting the class from the index. </div><br />然而，当我用Compass为数据库建立索引时，收到一个异常<br /><div class="quote_title">引用</div><div class="quote_div">cannot marshall a null id</div><br /><br />但是通过cpm.xml文件配置，建立索引，检索都没有问题，配置文件如下，难道被我发现了一个bug?<img src="/images/smiles/icon_surprised.gif"/><br /><pre name="code" class="java">
//Entry.cpm.xml
&lt;?xml version="1.0"?>
&lt;!DOCTYPE compass-core-mapping PUBLIC
    "-//Compass/Compass Core Mapping DTD 1.0//EN"
    "http://www.opensymphony.com/compass/dtd/compass-core-mapping.dtd">

&lt;compass-core-mapping package="xxx.xxx.pojos">
	&lt;class name="Entry" alias="entry">
		&lt;id name="id" />
                ...
		&lt;property name="title">
			&lt;meta-data>title&lt;/meta-data>
		&lt;/property>
		&lt;property name="content">
			&lt;meta-data>content&lt;/meta-data>
		&lt;/property>
	&lt;/class>
&lt;/compass-core-mapping>
</pre><br /><br /><pre name="code" class="java">
//Comment.cpm.xml
&lt;?xml version="1.0"?>
&lt;!DOCTYPE compass-core-mapping PUBLIC
    "-//Compass/Compass Core Mapping DTD 1.0//EN"
    "http://www.opensymphony.com/compass/dtd/compass-core-mapping.dtd">

&lt;compass-core-mapping package="com.gln.bloger.pojos">
	&lt;class name="Comment" alias="comment">
		&lt;id name="id" />
                  ...
		&lt;property name="content">
			&lt;meta-data>content&lt;/meta-data>
		&lt;/property>

        &lt;reference name="entry"/>
	&lt;/class>
&lt;/compass-core-mapping>
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/207924#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jun 2008 16:33:04 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/207924</link>
        <guid>http://nicholasbugs.javaeye.com/blog/207924</guid>
      </item>
          <item>
        <title>DispatchAction 和DynaValidateActionForm 结合使用时的问题</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/198774" style="color:red;">http://nicholasbugs.javaeye.com/blog/198774</a>&nbsp;
          发表时间: 2008年05月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          使用DispatchAction使得程序员能够大大减少action class的数量，但是在和Validation框架配合使用时，可能会遇到这样的问题：<br />程序员的本意是只有在action中的某个方法中才使用validation框架校验，但是只要把struts-config.xml中 &lt;action />标签中的validate设为true,那么进入该action的所有方法之前都会进行校验，很痛苦。现在有两个办法：<br />1，在stuts-config.xml中对一个class 配多个&lt;action/>标签， 比如：<br />&lt;action path="/saveUser" validate=true .....&nbsp; type="UserAction" /><br />&lt;action path="/initUser" validate=false.....&nbsp; type="UserAction" /><br />只在需要的action里将validate配成true<br />当然这只是权宜之计。<br />2：在validation.xml 中将form的name设置成需要的进行校验的action的path<br /><pre name="code" class="java">
&lt;formset>
 &lt;form name="/user.do?method=save">
  &lt;field>.... &lt;/filed>
 &lt;/form>
&lt;/formset>
</pre><br />这样只有在save（）方法调用时才会校验。<br /><br />update:除了这个，还有另外一个解决方法：<br />令struts-config.xml中的validate=false，然后在自己的action中需要校验的地方追加以下代码：<br /><pre name="code" class="java">
ActionMessages errors = form.validate(mapping, request);//在需要的地方调用validate()方法，其中validate（）方法的校验规则已经定义在validation.xml中了
if(!errors.isEmpty()){
    saveErrors(reqeust, errors);
   return mapping.getInputForward(); 
}
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/198774#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 30 May 2008 18:03:51 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/198774</link>
        <guid>http://nicholasbugs.javaeye.com/blog/198774</guid>
      </item>
          <item>
        <title>Hibernate Expressions 表达式属性的含义</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/198561" style="color:red;">http://nicholasbugs.javaeye.com/blog/198561</a>&nbsp;
          发表时间: 2008年05月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          看过《深入浅出Hibernate》的人想必对这个例子都非常熟悉<br /><pre name="code" class="java"> Criteria criteria = session.createCriteria(TUser.class);

 criteria.add(Expression.eq("name","Erica"));
 criteria.add(Expression.eq("sex",new Integer(1))); </pre><br /><br />Expression.eq(String arg1, Object arg2) 就等价于 SQL中的“field = value”。<br /><br />note:<br />但是实际上arg1代表的是class TUser 中的property - name 而不是数据库表T_User中的<br />filed - name<br /><br />由于在用简单属性查询时，有时候根本意识不到自己现在操作对象的是属性还是DB中的域，<br />下面用一个更明显例子：<br />User.java<br /><pre name="code" class="java">
class User {
 private String name;
 private String id;
 private Integer age;
 /*一下略去 getter setter*/
}
</pre><br />Computer.java<br /><pre name="code" class="java">
class Computer{
 String id;
 String name;
 User owner;
/*getter setter 略去*/
}
</pre><br /><br />一个User 对象可以拥有 多台 Computer,这样就形成了 many-to-one 结构。<br />在T_COMPUTER中用一个域 OWNER_ID记住 机主的ID。<br /><br />如果要查询一个User对象用有的所有电脑时，<br />使用表达式 Expression.eq("owner" owner)<br />而不是 Expression.eq("OWNER_ID", owner.getId());<br />这就印证了上面的说法<br /><br /><br />Restrictions应该也是类似的。
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/198561#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 30 May 2008 10:27:41 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/198561</link>
        <guid>http://nicholasbugs.javaeye.com/blog/198561</guid>
      </item>
          <item>
        <title>spring struts velocity 怎么整合</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/197462" style="color:red;">http://nicholasbugs.javaeye.com/blog/197462</a>&nbsp;
          发表时间: 2008年05月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在做一个系统，使用spring做为框架，struts当controller,velocity做为view,<br />spring 与struts 是这样整合的：<br />stuts-config.xml中：<br /><pre name="code" class="java">
 &lt;action path="/entry" type="org.springframework.web.struts.DelegatingActionProxy" //动作委托
		validate="true"
		input="/welcome.do"
		parameter="method">
		&lt;forward name="add" path="/WEB-INF/views/admin/addEntry.vm"/>
		&lt;forward name="edit" path="/WEB-INF/views/admin/editEntry.vm"/>
		&lt;forward name="success" path="/WEB-INF/views/admin/listEntry.vm"/>
	&lt;/action> 

</pre><br />beans.xml中：<br /><pre name="code" class="java">
  &lt;bean name="/entry" class="com.gln.bloger.action.EntryAction" parent="baseAction"/>
</pre><br /><br />现在想在vm文件中使用spring.vm中的宏来从resource文件中读取内容并且显示在页面上（国际化嘛）<br />这时侯应该怎样把velocity整合进来？需要做哪些配置？<br />我目前的做法是 在beans.xml中配置了<br />viewResolver和velocityConfigurer，但是发现这样就无法解析vm文件，感觉是没有被org.apache.velocity.tools.view.servlet.VelocityViewServlet 这个servlet解析。
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/197462#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 27 May 2008 14:56:22 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/197462</link>
        <guid>http://nicholasbugs.javaeye.com/blog/197462</guid>
      </item>
          <item>
        <title>泛型BaseDAO</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/190094" style="color:red;">http://nicholasbugs.javaeye.com/blog/190094</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          对于属性比较多的bean,如果不使用hibernate 或者ibatis等持久化解决方案，写查询函数时，单单将ResultSet 转换成Object就是一件很痛苦的事情，因此可以采用java反射机制做一个BaseDao，把ResultSet 映射到Object 的操作封装起来，简化了DAO的开发，<br />本文参照了[url]http://blog.csdn.net/cping1982/archive/2007/10/01/1808647.aspx<br />[/url]并且做了一点改进<br /><pre name="code" class="java">public static String[][] proterty2Column = 
	    {{"member_id","memberId"},		
		{"name", "name"}};
	/**
	 * change the first char to upper case
	 * @param s
	 * @return
	 */
	private static String upperFirstChar(String s){
		char [] chars = s.toCharArray();
		chars[0] = Character.toUpperCase(chars[0]);
		return new String(chars);
	}
	/**
* ResultSet 映射成 Object
	 * @param clzz
	 * @param rs 
	 * @param obj
	 * @param fieldName
	 * @param varibleName
	 * @throws NoSuchMethodException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws SQLException
	 * @throws NoSuchFieldException 
	 * @throws SecurityException 
	 */
    private void  mapResultSet2Object(ResultSet rs, Object obj, String propertyName,
 String columName) 
throws NoSuchMethodException, IllegalAccessException, 
InvocationTargetException, SQLException, 
SecurityException, NoSuchFieldException {
    	 Class &lt; ? extends Object >clazz = obj.getClass();
         Class &lt; ? extends Object >propertyType = clazz.getDeclaredField(propertyName).
getType();
       Method method = clazz.getDeclaredMethod("set"+ 
     upperFirstChar( propertyName ), new Class[] { propertyType });
       if (propertyType == String.class)
           method.invoke(obj, (Object [])new String[] 
{rs.getString( columName ) });
       else if (propertyType == int.class)
           method.invoke(obj, (Object [])new Integer[] 
{new Integer( rs.getInt( columName )) });
       else if (propertyType == float.class)
           method.invoke(obj, (Object [])new Float[] 
{new Float( rs.getFloat( columName )) });
       else if (propertyType == long.class)
           method.invoke(obj, (Object [])new Long[]
 {new Long( rs.getLong( columName )) });
       else if (propertyType == double.class)
           method.invoke(obj, (Object [])new Double[] 
{new Double( rs.getDouble( columName )) });
       else if(propertyType == Date.class){
    	   method.invoke(obj, (Object [])new Date[] 
{rs.getDate(columName)});
       }
   }
    /**
     * 单行查询
     * @param 
     * @param conn
     * @param sql
     * @param clazz
     * @param params
     * @return
     * @throws Exception
     */
    public  &lt;T> T getItem(Connection conn, String sql, Class&lt;T> clazz, 
  String params[])throws Exception{
    	PreparedStatement pstmt = null;
    	ResultSet rset = null;
    	T t  = null;
    	try {
    		pstmt = conn.prepareStatement(sql);
    		//set parameter 
               for(int i=0; i&lt;params.length; i++){
    			pstmt.setString(i+1, (String)params[i]);
    		}
              rset = pstmt.executeQuery();
            if (rset.next()) {
                t =  clazz.newInstance();
    		for(int i=0; i&lt; proterty2Column.length; i++) {
                	String propertyName = proterty2Column[i][1].trim();
                    String ColumnName = proterty2Column[i][0].trim();
                    mapResultSet2Object(rset, t, propertyName, ColumnName);
                }
            }
        } catch (Exception e) {
        	e.printStackTrace();
	    } finally {
	        DBUtil.closeAll(conn, pstmt, rset);
	    }
     return t;
    }</pre><br /><pre name="code" class="java">
   /**
     * 多行查询
     * @param 
     * @param conn
     * @param sql
     * @param proterty2Column
     * @param clazz
     * @return
     * @throws Exception
     */
    public   &lt;T> List &lt;T> getItems(Connection conn, String sql, Class&lt;T> clazz,  
String[] params) throws Exception{
    	if (proterty2Column.length == 0)
            return null;
    	PreparedStatement pstmt = null;
    	ResultSet rset = null;
    	List&lt;T> list = new ArrayList&lt;T>();
    	try {
    		pstmt = conn.prepareStatement(sql);
               for(int i=0; i&lt;params.length; i++){
    			pstmt.setString(i+1, (String)params[i]);
    		}
    		rset = pstmt.executeQuery();
            while (rset.next()) {
    		for(int i=0; i&lt; proterty2Column.length; i++) {
                	String propertyName = proterty2Column[i][1].trim();
                    String ColumnName = proterty2Column[i][0].trim();
                    fetchResult2Object(rset, obj, propertyName, ColumnName);
                }
                if( null == obj ) continue;
                list.add(obj);
            }
        } catch (Exception e) {
        	e.printStackTrace();
	    } finally {
	        DBUtil.closeAll(conn, pstmt, rset);
	    }
     return list;
    }
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/190094#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' 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/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 May 2008 11:57:21 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/190094</link>
        <guid>http://nicholasbugs.javaeye.com/blog/190094</guid>
      </item>
          <item>
        <title>struts中的属性自动装配功能</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/187952" style="color:red;">http://nicholasbugs.javaeye.com/blog/187952</a>&nbsp;
          发表时间: 2008年04月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天遇到一个有些意外的需求：在用户输入信息不合法时，回到输入页面并且 将输入的字符串两头的空格trim掉以后显示在输入框里，很不幸的是我把输入页面和验证逻辑写在了两个action（A, B）里，(项目框架限制得很死没办法) 在验证action里校验出错以后mapping.findForward("A.do") ，<br />发现A页面再次初始化时，在B中做的trim没有起作用，显示的还是用户第一次输入的值。经过一个上午的研究，找出了答案：<br />struts框架在处理http请求时，会把HTTP请求中的包含的属性装配到form中（这些属性被放在request.parameterMaps中），于是在执行mapping.findForward("A.do")时，相当于又发起了一次http请求，这时 struts的actionServlet会从parameterMaps中读取第一次提交数据时的属性值，并且装配到form中（A B共用一个form），于是在B中做的trim后的值被盖掉了。<br /><br />解决方案：将验证在A画面中做，这样即使校验出错，也不会再去发一次请求。。。<br /><br />具体过程如图：
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/187952#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Apr 2008 11:53:59 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/187952</link>
        <guid>http://nicholasbugs.javaeye.com/blog/187952</guid>
      </item>
          <item>
        <title>Set中如何保证元素的唯一性</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/169141" style="color:red;">http://nicholasbugs.javaeye.com/blog/169141</a>&nbsp;
          发表时间: 2008年03月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在Set里如果保证其中元素的唯一型：<br />我们来看看 Set的一个实现HashSet中的add方法，HashSet内部使用一个HashMap来存放对象，<br />HashSet把要保存的对象做为其内部HashMap的key，如下:<br /><pre name="code" class="java">//PRESENT为一个辅助的Object型对象
public boolean add(E o) {
	return map.put(o, PRESENT)==null;
    }</pre>如果有两个对象A,B, A.equals(B)返回ture,则 <br />A和B只会有一个被保存在set中。<br />在HashMap中判断两个key相同的逻辑是 hashcode()相等并且 equals()返回true。<br /><br />再看看HashMap中的put()<br /><pre name="code" class="java">public V put(K key, V value) {
	if (key == null)
	    return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry e = table[i]; e != null; e = e.next) {
            Object k;
            /**
            * 因为A.equals(B)为true,故A.hashCode() == B.hashCode();
            * 故会进入到下面的if块内部，从而保证了A和B只有一个被保存在Set里
            */    
        if (e.hash == hash &amp;&amp; ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }</pre><br /><br />刚好看到另外一个帖子，http://www.javaeye.com/topic/123202<br />if (e.hash == hash &amp;&amp; ((k = e.key) == key || key.equals(k))) 中，只有hashcode相等时<br />才会调用后面的key.equals(k)
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/169141#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Fri, 07 Mar 2008 17:06:46 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/169141</link>
        <guid>http://nicholasbugs.javaeye.com/blog/169141</guid>
      </item>
          <item>
        <title>HttpServletRequest 的 getAttribute() getParameter()</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/169100" style="color:red;">http://nicholasbugs.javaeye.com/blog/169100</a>&nbsp;
          发表时间: 2008年03月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          HttpServletRequest类既有getAttribute()方法，也由getParameter()方法，这两个方法有以下区别：<br /><br />（1）HttpServletRequest类有setAttribute()方法，而没有setParameter()方法<br /><br />（2）当两个Web组件之间为链接关系时，被链接的组件通过getParameter()方法来获得请求参数，例如假定welcome.jsp和authenticate.jsp之间为链接关系，welcome.jsp中有以下代码：<br /><br />&lt;a&nbsp; href="authenticate.jsp?username=lily">authenticate.jsp&nbsp; &lt;/a><br /><br />或者：<br /><br />&lt;form&nbsp; name="form1"&nbsp; method="post"&nbsp; action="authenticate.jsp"><br />&nbsp;&nbsp; 请输入用户姓名：&lt;input&nbsp; type="text"&nbsp; name="username"><br />&nbsp;&nbsp; &lt;input&nbsp; type="submit"&nbsp; name="Submit"&nbsp; value="提交"><br />&lt;/form><br /><br />在authenticate.jsp中通过request.getParameter("username")方法来获得请求参数username:<br /><br />&lt;%&nbsp; String&nbsp; username=request.getParameter("username");&nbsp; %><br /><br />（3）当两个Web组件之间为转发关系时，转发目标组件通过getAttribute()方法来和转发源组件共享request范围内的数据。假定&nbsp; authenticate.jsp和hello.jsp之间为转发关系。authenticate.jsp希望向hello.jsp传递当前的用户名字，&nbsp; 如何传递这一数据呢？先在authenticate.jsp中调用setAttribute()方法：<br /><br />&lt;%<br />String&nbsp; username=request.getParameter("username");<br />request.setAttribute("username"，username);<br />%><br /><br />&lt;jsp:forward&nbsp; page="hello.jsp"&nbsp; /><br /><br />在hello.jsp中通过getAttribute()方法获得用户名字:<br /><br />&lt;%&nbsp; String&nbsp; username=(String)request.getAttribute("username");&nbsp; %><br />Hello:&nbsp; &lt;%=username&nbsp; %><br /><br />从更深的层次考虑，request.getParameter()方法传递的数据，会从Web客户端传到Web服务器端，代表HTTP请求数据。request.getParameter()方法返回String类型的数据。<br /><br />request.setAttribute()和getAttribute()方法传递的数据只会存在于Web容器内部，在具有转发关系的Web组件之间共享。这两个方法能够设置Object类型的共享数据。<br /><br />request.getParameter()取得是通过容器的实现来取得通过类似post，get等方式传入的数据，，&nbsp; request.setAttribute()和getAttribute()只是在web容器内部流转，仅仅是请求处理阶段，这个的确是正解.<br /><br />getAttribute是返回对象,getParameter返回字符串<br /><br /><br />request.getAttribute()方法返回request范围内存在的对象，而request.getParameter()方法是获取http提交过来的数据。
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/169100#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 07 Mar 2008 16:31:16 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/169100</link>
        <guid>http://nicholasbugs.javaeye.com/blog/169100</guid>
      </item>
          <item>
        <title>关于hashcode的一点理解</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/169037" style="color:red;">http://nicholasbugs.javaeye.com/blog/169037</a>&nbsp;
          发表时间: 2008年03月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          hashcode()是java.lang.Object的一个函数，它的主要被使用在对Collection中对象的存取中。<br />java.lang.Object中对hashcode()方法的描述是这样的：<br />&nbsp;&nbsp;&nbsp; <div class="quote_title">引用</div><div class="quote_div"><br />&nbsp;&nbsp;&nbsp;&nbsp; The general contract of hashCode&nbsp; is: <br />&nbsp;&nbsp;&nbsp;&nbsp; I:&nbsp;&nbsp; Whenever it is invoked on the same object more than once during <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; an execution of a Java application, the hashCode　 method <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; must consistently return the same integer, provided no information <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used in 　equals　 comparisons on the object is modified.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This integer need not remain consistent from one execution of an<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application to another execution of the same application. <br />&nbsp;&nbsp;&nbsp;&nbsp; II:&nbsp;&nbsp; If two objects are equal according to the 　equals(Object)　<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method, then calling the hashCode method on each of <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the two objects must produce the same integer result. <br />&nbsp;&nbsp;&nbsp;&nbsp; III:&nbsp; It is *not* required that if two objects are unequal <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; according to the&nbsp; java.lang.Object#equals(java.lang.Object) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method, then calling the hashCode&nbsp; method on each of the <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; two objects must produce distinct integer results.&nbsp; However, the <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; programmer should be aware that producing distinct integer results <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for unequal objects may improve the performance of hashtables.<br />&nbsp;&nbsp;&nbsp; </div><br />再来看看java.util.HashMap 中 存取对象时对hashcode()函数的使用：&nbsp;&nbsp;&nbsp; <br />&nbsp; <pre name="code" class="java">public V get(Object key) {
	if (key == null)
	    return getForNullKey();
        //对key的hash码进行映射 
        int hash = hash(key.hashCode());
        /**
         *把得到的hash码处理成0到table.length之间的值，做为查找对象的index，沿着
         *这条链表查找该key对应的对象（hashMap 中使用链表数组储存对象）。
         *e.hash与该key的hash码相等的Entry对象中的value被返回。
         */              
        for (Entry&lt;K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash &amp;&amp; ((k = e.key) == key || key.equals(k)))
                return e.value;
        }
        return null;
    }</pre><br />由此看来如果一个class的hashcode函数效果不够好，就可能使得hashMap的链表数组中的某个链表非常长，从而影响了hashMap的存取效率。
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/169037#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 07 Mar 2008 13:41:47 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/169037</link>
        <guid>http://nicholasbugs.javaeye.com/blog/169037</guid>
      </item>
          <item>
        <title>(转)Blob Clob存取解决方案</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/167623" style="color:red;">http://nicholasbugs.javaeye.com/blog/167623</a>&nbsp;
          发表时间: 2008年03月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          数据库在当今的应用越来越广泛了，同样伴随着领域的广泛，存储的内容也不在是只有数值、字符、boolean几种类型，而是越来越多样化。在这样的前提下就出现了Blob和Clob两个类型。下面我将对这个两个类型在JDBC中的应用，进行一个简短的介绍<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Blob是指二进制大对象也就是英文Binary Large Object的所写，而Clob是指大字符对象也就是英文Character Large Object的所写。由此可见这两个类型都是用来存储大量数据而设计的，其中BLOB是用来存储大量二进制数据的；CLOB用来存储大量文本数据。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么有人肯定要问既然已经有VARCHAR和VARBINARY两中类型，为什么还要再使用另外的两种类型呢？其实问题很简单，VARCHAR和 VARBINARY两种类型是有自己的局限性的。首先说这两种类型的长度还是有限的不可以超过一定的限额，以VARCHAR再ORA中为例长度不可以超过 4000；那么有人又要问了，LONGVARCHAR类型作为数据库中的一种存储字符的类型可以满足要求，存储很长的字符，那为什么非要出现CLOB类型呢？其实如果你用过LONGVARCHAR类型就不难发现，该类型的一个重要缺陷就是不可以使用LIKE这样的条件检索。（稍候将介绍在CLOB中如何实现类似LIKE的模糊查找）另外除了上述的问题外，还又一个问题，就是在数据库中VARCHAR和VARBINARY的存取是将全部内容从全部读取或写入，对于100K或者说更大数据来说这样的读写方式，远不如用流进行读写来得更现实一些。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在JDBC中有两个接口对应数据库中的BLOB和CLOB类型，java.sql.Blob和java.sql.Clob。和你平常使用数据库一样你可以直接通过ResultSet.getBlob()方法来获取该接口的对象。与平时的查找唯一不同的是得到Blob或Clob的对象后，我们并没有得到任何数据，但是我们可以这两个接口中的方法得到数据<br /><br />例如：<br /> Blob b=resultSet.getBlob(1);<br /> InputStream bin=b.getBinaryStryeam();<br /> Clob c=resultSet.getClob(2);<br /> Reader cReader=c.getCharacterStream():<br />关于Clob类型的读取可以使用更直接的方法，就是直接通过ResultSet.getCharacterStream();方法获得字符流，但该方法并不安全，所以建议还是使用上面例子的方法获取Reader。<br />另外还有一种获取方法，不使用数据流，而是使用数据块。<br />例如<br /> Blob b=resultSet.getBlob(1);<br /> byte data=b.getByte(0,b.length());<br /> Clob c=resultSet.getClob(2);<br /> String str=c.getSubString(0,c.length()):<br />在这里我要说明一下，这个方法其实并不安全，如果你很细心的话，那很容易就能发现getByte()和getSubString()两个方法中的第二个参数都是int类型的，而BLOB和CLOB是用来存储大量数据的。而且Bolb.length()和Clob.length()的返回值都是long类型的，所以很不安全。这里不建议使用。但为什么要在这里提到这个方法呢？稍候告诉你答案，这里你需要记住使用数据块是一种方法。<br /><br />在存储的时候也同样的在PreparedStatement和CallableStatememt中，以参数的形式使用setBlob()和 setClob方法把Blob和Clob对象作为参数传递给SQL。这听起来似乎很简单对吧，但是并非我们想象的这样，很不幸由于这两个类型的特殊， JDBC并没有提供独立于数据库驱动的Blob和Clob建立对象。因此需要自己编写与驱动有关的代码，但这样又牵掣到移植性。怎样才是解决办法呢？这就要用到前面说过的思想了使用数据块进行写操作。同样用PreparedStatement和CallableStatememt类，但参数的设置可以换为 setAsciiStream、setBinaryStream、setCharacterStream、setObject（当然前3个同样存在长度的问题）<br />下面给大家个例子以方便大家理解<br /> public void insertFile(File f)&nbsp; throws Exception{<br />&nbsp; FileInputStream fis=new FileInputStream(f,Connection conn);<br />&nbsp; byte[] buffer=new byte[1024];<br />&nbsp; data=null;<br />&nbsp; int sept=0;int len=0;<br />&nbsp; <br />&nbsp; while((sept=fis.read(buffer))!=-1){<br />&nbsp;&nbsp; if(data==null){<br />&nbsp;&nbsp;&nbsp; len=sept;<br />&nbsp;&nbsp;&nbsp; data=buffer;<br />&nbsp;&nbsp; }else{<br />&nbsp;&nbsp;&nbsp; byte[] temp;<br />&nbsp;&nbsp;&nbsp; int tempLength;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; tempLength=len+sept;<br />&nbsp;&nbsp;&nbsp; temp=new byte[tempLength];<br />&nbsp;&nbsp;&nbsp; System.arraycopy(data,0,temp,0,len);<br />&nbsp;&nbsp;&nbsp; System.arraycopy(buffer,0,temp,len,sept);<br />&nbsp;&nbsp;&nbsp; data=temp;<br />&nbsp;&nbsp;&nbsp; len=tempLength;<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp; if(len!=data.length()){<br />&nbsp;&nbsp;&nbsp; byte temp=new byte[len];<br />&nbsp;&nbsp;&nbsp; System.arraycopy(data,0,temp,0,len);<br />&nbsp;&nbsp;&nbsp; data=temp;<br />&nbsp;&nbsp; }<br />&nbsp; }<br />&nbsp; String sql="insert into fileData (filename,blobData) value(?,?)";<br />&nbsp; PreparedStatement ps=conn.prepareStatement(sql);<br />&nbsp; ps.setString(1,f.getName());<br />&nbsp; ps.setObject(2,data);<br />&nbsp; ps.executeUpdate();<br /><br /> }<br /><br />最后由于刚刚说过Clob类型读取字符的长度问题，这里再给大家一段代码，希望对你有帮助<br /> public static String getClobString(ResultSet rs, int col) {<br />&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp; Clob c=resultSet.getClob(2);<br />&nbsp;&nbsp;&nbsp; Reader reader=c.getCharacterStream():<br />&nbsp;&nbsp;&nbsp; if (reader == null) {<br />&nbsp; return null;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; StringBuffer sb = new StringBuffer();<br />&nbsp;&nbsp;&nbsp; char[] charbuf = new char[4096];<br />&nbsp;&nbsp;&nbsp; for (int i = reader.read(charbuf); i > 0; i = reader.read(charbuf)) {<br />&nbsp; sb.append(charbuf, 0, i);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return sb.toString();<br />&nbsp;&nbsp; } catch (Exception e) {<br />&nbsp;&nbsp;&nbsp; return "";<br />&nbsp;&nbsp; }<br />&nbsp; }<br /><br />另外似乎前面还提到过LIKE检索的问题。LONGVARCHAR类型中不可以用LIKE查找（至少ORA中不可以使用，其他的数据库我没有试过），在ORA中我们可以使用这样一个函数dbms_lob.instr来代替LIKE来个例子吧<br /><br />select docid,dat0 from text where dbms_lob.instr(dat0,'魏',1,1)>0<br /><br />在text表中有两个字段docid用来放文档编号dat0为clob类型存放文章内容；这句话的意思就是检索第一条dat0中出现第一次"魏"字的数据。听起来这个检索的数据有点象google的“手气不错”<br /><br />以上只是对数据库中比较特殊的两个类型做了简单的说明，希望能对你有所帮助；另外笔者也只是对ORA数据库有一点点的了解，其他的数据库不是很清楚，如果有什么不对的地方也请各位指出，可以通过邮件联系我zuyingwei@hotmail.com或merlin_wei@hotmail.com
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/167623#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' 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/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 04 Mar 2008 10:22:44 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/167623</link>
        <guid>http://nicholasbugs.javaeye.com/blog/167623</guid>
      </item>
          <item>
        <title>碰到一个需要根据页面内容调整窗口大小的需求，网上找到个解决方案，收藏</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/166053" style="color:red;">http://nicholasbugs.javaeye.com/blog/166053</a>&nbsp;
          发表时间: 2008年02月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          function win_onLoad(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var width = document.all["tblKsList"].offsetWidth;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var height = document.all["tblKsList"].offsetHeight; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width = eval(width + 50);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; height = eval(height + 50);<br /> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (width &lt; 500){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width = 500;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else if (width > screen.width){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width = screen.width;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (height &lt; 400){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; height = 400;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else if (height > screen.height){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; height = screen.height;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; window.resizeTo(width,height);<br />&nbsp;&nbsp;&nbsp; }
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/166053#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' 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>Fri, 29 Feb 2008 10:53:57 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/166053</link>
        <guid>http://nicholasbugs.javaeye.com/blog/166053</guid>
      </item>
          <item>
        <title>SQL语句的执行步骤</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/164980" style="color:red;">http://nicholasbugs.javaeye.com/blog/164980</a>&nbsp;
          发表时间: 2008年02月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前几天在这个问题上栽了，所以写下来纪念一下：<br /><br /><br />SQL语句的执行步骤<br />一条SQL语句的处理过程要经过以下几个步骤。<br />1 <strong>语法分析</strong> 分析语句的语法是否符合规范，衡量语句中各表达式的意义。<br />2 <strong>语义分析</strong> 检查语句中涉及的所有数据库对象是否存在，且用户有相应的权限。<br />3 <strong>视图转换</strong> 将涉及视图的查询语句转换为相应的对基表查询语句。<br />4 <strong>表达式转换</strong> 将复杂的SQL表达式转换为较简单的等效连接表达式。<br />5 <strong>选择优化器</strong> 不同的优化器一般产生不同的“执行计划”<br />6 <strong>选择连接方式</strong> Oracle有三种连接方式，对多表连接Oracle可选择适当的连接方式。<br />7 <strong>选择连接顺序</strong> 对多表连接Oracle选择哪一对表先连接，选择这两表中哪个表做为源数据表。<br />8 <strong>选择数据的搜索路径</strong> 根据以上条件选择合适的数据搜索路径，如是选用全表搜索还是利用索引或是其他的方式。<br />9 <strong>运行“执行计划</strong>”
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/164980#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' 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/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 26 Feb 2008 09:35:02 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/164980</link>
        <guid>http://nicholasbugs.javaeye.com/blog/164980</guid>
      </item>
          <item>
        <title>将进酒</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/161136" style="color:red;">http://nicholasbugs.javaeye.com/blog/161136</a>&nbsp;
          发表时间: 2008年02月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          君不见黄河之水天上来，奔流到海不复回。<br />君不见高堂明镜悲白发，朝如青丝暮成雪。<br />人生得意须尽欢，莫使金樽空对月。<br />天生我材必有用，千金散尽还复来。<br />烹羊宰牛且为乐，会须一饮三百杯。<br />岑夫子，丹丘生，将进酒，君莫停。<br />与君歌一曲，请君为我侧耳听。<br />钟鼓馔玉不足贵，但愿长醉不愿醒。<br />古来圣贤皆寂寞，惟有饮者留其名。<br />陈王昔时宴平乐，斗酒十千恣欢谑。<br />主人何为言少钱，径须沽取对君酌。<br />五花马，千金裘，呼儿将出换美酒，与尔同销万古愁。
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/161136#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 02 Feb 2008 10:59:30 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/161136</link>
        <guid>http://nicholasbugs.javaeye.com/blog/161136</guid>
      </item>
          <item>
        <title>关于hibernate session管理的一些问题</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/147881" style="color:red;">http://nicholasbugs.javaeye.com/blog/147881</a>&nbsp;
          发表时间: 2007年12月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          hibernate中,sessionFactory是线程安全的，可以被所有的应用程序共享，而session不是线程安全的，被多个线程共享时会出现不可预知的后果，那么对session 采用ThreadLocal实现共享会出问题吗？<br /><pre name="code" class="java">
public class HibernateUtil {
	    private static SessionFactory sessionFactory;
	    static{
		try{
		    sessionFactory = new Configuration().configure().buildSessionFactory();	
		}catch（HibernateException e）{
		 throw new RunTimeException("Configuration problem:"+e.getMessage());
		}
	    }	
	   public static final TreadLocal session = new ThreadLocal();
	   public static Session currentSession() thrwos HibernateException{
	  	Session s = (Session) session.get();
		if(s==null){
			s = sessionFactory().openSession();
			session.set(s);
		}
		return s;	
	   } 
	  public static void closeSession() throws HibernateException{
		Session s = (Session)session.get();
		session.set(null);
		if(null != s){
		    s.close();
		}
	  }
	}
</pre><br /><br />这个是《深入浅出hibernate》中关于session管理的实现， 有些不明白。如果各位有比较好的对session管理的方法，大家都来说说。
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/147881#comments" style="color:red;">已有 <strong>4</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' 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/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Dec 2007 16:54:59 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/147881</link>
        <guid>http://nicholasbugs.javaeye.com/blog/147881</guid>
      </item>
          <item>
        <title>J2EE 容器处理ＨＴＴＰ请求的原理</title>
        <author>NicholasBugs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nicholasbugs.javaeye.com">NicholasBugs</a>&nbsp;
                    链接：<a href="http://nicholasbugs.javaeye.com/blog/146217" style="color:red;">http://nicholasbugs.javaeye.com/blog/146217</a>&nbsp;
          发表时间: 2007年12月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          至今不太明白Ｊ２ＥＥ　服务器处理ＨＴＴＰ请求的原理，看到一些资料说是容器通过ｓｃｏｋｅｔ　侦听ＨＴＴＰ请求的，感觉比较奇怪，谁能推荐一些关于这些方面的资料。ｔｏｍｃａｔ的文档我也找过了，没有对它的原理进行严密的阐述。谢谢啦。<img src="/images/smiles/icon_biggrin.gif"/>
          <br/><br/>
          <span style="color:red;">
            <a href="http://nicholasbugs.javaeye.com/blog/146217#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 05 Dec 2007 16:08:08 +0800</pubDate>
        <link>http://nicholasbugs.javaeye.com/blog/146217</link>
        <guid>http://nicholasbugs.javaeye.com/blog/146217</guid>
      </item>
      </channel>
</rss>