﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-豪情</title><link>http://www.blogjava.net/jikey/</link><description>JAVA交流：38611691</description><language>zh-cn</language><lastBuildDate>Tue, 21 Apr 2026 06:32:20 GMT</lastBuildDate><pubDate>Tue, 21 Apr 2026 06:32:20 GMT</pubDate><ttl>60</ttl><item><title>关于s2sh源代码下载</title><link>http://www.blogjava.net/jikey/archive/2010/07/24/327023.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Sat, 24 Jul 2010 10:05:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/07/24/327023.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/327023.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/07/24/327023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/327023.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/327023.html</trackback:ping><description><![CDATA[xwork-core-2.1.6<br />
<a target="_blank" href="http://release.opensymphony.com/xwork/2.1.6/">http://release.opensymphony.com/xwork/2.1.6/</a><br />
struts 2.1.8<br />
<a target="_blank" href="http://struts.apache.org/download.cgi#struts2181">http://struts.apache.org/download.cgi#struts2181</a><br />
spring 3.0.3<br />
<a target="_blank" href="http://www.springsource.org/download">http://www.springsource.org/download</a><br />
hibernate <br />
<a target="_blank" href="http://sourceforge.net/projects/hibernate/files/">http://sourceforge.net/projects/hibernate/files/</a><br />
itatis 3v<br />
<a target="_blank" href="http://ibatis.apache.org/java.cgi">http://ibatis.apache.org/java.cgi</a><br />

<img src ="http://www.blogjava.net/jikey/aggbug/327023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-07-24 18:05 <a href="http://www.blogjava.net/jikey/archive/2010/07/24/327023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts 2.1.6 超级大乱码 StrutsPrepareAndExecuteFilter学习笔记</title><link>http://www.blogjava.net/jikey/archive/2010/07/22/326885.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Thu, 22 Jul 2010 15:45:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/07/22/326885.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/326885.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/07/22/326885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/326885.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/326885.html</trackback:ping><description><![CDATA[<p>package org.apache.struts2.dispatcher.ng.filter; <br />
<br />
import
org.apache.struts2.StrutsStatics; <br />
import
org.apache.struts2.dispatcher.Dispatcher; <br />
import
org.apache.struts2.dispatcher.ng.PrepareOperations; <br />
import
org.apache.struts2.dispatcher.ng.ExecuteOperations; <br />
import
org.apache.struts2.dispatcher.ng.InitOperations; <br />
import
org.apache.struts2.dispatcher.mapper.ActionMapping; <br />
<br />
import
javax.servlet.*; <br />
import javax.servlet.http.HttpServletRequest; <br />
import
javax.servlet.http.HttpServletResponse; <br />
import java.io.IOException;
<br />
<br />
/** <br />
* Handles both the preparation and execution phases of the
Struts dispatching process.&nbsp; This filter is better to use <br />
* when you don't
have another filter that needs access to action context information, such as
Sitemesh. <br />
*/ <br />
public class StrutsPrepareAndExecuteFilter implements
StrutsStatics, Filter { <br />
&nbsp;&nbsp;&nbsp; private PrepareOperations prepare; <br />
&nbsp;&nbsp;&nbsp;
private ExecuteOperations execute;&nbsp;<br />
<span style="color: #ff0000;">//初始化过滤器<br />
</span>&nbsp;&nbsp;&nbsp; public void init(FilterConfig
filterConfig) throws ServletException { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitOperations init = new
InitOperations(); <span style="color: #ff0000;">//初始化辅助对象，封装了初始化的一些操作<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FilterHostConfig config = new
FilterHostConfig(filterConfig);&nbsp;<span style="color: #ff0000;">//对filterConfig进行封装</span><span style="color: #ff0000;"><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init.initLogging(config); <span style="color: #ff0000;">//通过config,初始化内部Struts的记录</span></p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dispatcher dispatcher = init.initDispatcher(config); <span style="color: #ff0000;">//通过config,创建并初始化dispatcher</span></p>
<p>&nbsp;</p>
<p><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init.initStaticContentLoader(config,
dispatcher);&nbsp;<span style="color: #ff0000;">//通过config和dispatcher，初始化与过滤器相关的静态内容加载器</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
<span style="color: #ff0000;">//通过config和dispatcher,创建request被处理前的系列操作对象</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
execute = new ExecuteOperations(filterConfig.getServletContext(),
dispatcher);<span style="color: #ff0000;">//通过config和dispatcher,创建处理request的系列操作对象</span><br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} finally { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init.cleanup(); <span style="color: #ff0000;">//清空ActionContext</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
<br />
&nbsp;&nbsp;&nbsp; }
<br />
<br />
&nbsp;&nbsp;&nbsp; public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException { <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
HttpServletRequest request = (HttpServletRequest) req; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
HttpServletResponse response = (HttpServletResponse) res; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prepare.createActionContext(request, response); <span style="color: #ff0000;">//创建ACTIONCONTEXT,并初始化Theadlocal</span><span style="text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; letter-spacing: normal; color: #000000;" class="Apple-style-span">&nbsp;</span></span></p>
<p><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prepare.assignDispatcherToThread();
<span style="color: #ff0000;">//指派dispatcher给Theadlocal<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
prepare.setEncodingAndLocale(request, response); <span style="color: #ff0000;">//设置request的编码和LOCAL</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request =
prepare.wrapRequest(request);&nbsp;<span style="color: #ff0000;">//封装request</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionMapping mapping =
prepare.findActionMapping(request, response); <span style="color: #ff0000;">//查找并选择创建ActionMapping</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (mapping
== null) {<span style="color: #ff0000;"> //如果映射不存在</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
boolean handled = execute.executeStaticResourceRequest(request, response); <span style="color: #ff0000;">//</span><span style="color: #ff0000;">试图执行一个静态资源的请求<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!handled) {
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chain.doFilter(request, response); <br />
&nbsp;&nbsp;&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; } else { <span style="color: #ff0000;">//如果存在映射</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
execute.executeAction(request, response, mapping); <span style="color: #ff0000;">//执行action<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prepare.cleanupRequest(request); <span style="color: #ff0000;">//清除request的Threadlocal</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; }
<br />
<br />
&nbsp;&nbsp;&nbsp; public void destroy() { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prepare.cleanupDispatcher();
<br />
&nbsp;&nbsp;&nbsp; } <br />
}</span></p>
<p><span style="color: #000000;">来自于：http://qianjian21.javaeye.com/blog/480206</span></p>
<p><span style="color: #000000;">最后不得不下载新版的struts 解决这个问题<br />
</span></p>
<img src ="http://www.blogjava.net/jikey/aggbug/326885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-07-22 23:45 <a href="http://www.blogjava.net/jikey/archive/2010/07/22/326885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring持久化的异常处理和模板类的介绍 </title><link>http://www.blogjava.net/jikey/archive/2010/07/06/325351.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Tue, 06 Jul 2010 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/07/06/325351.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/325351.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/07/06/325351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/325351.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/325351.html</trackback:ping><description><![CDATA[http://java.ccidnet.com/art/3559/20070612/1109407_1.html
<img src ="http://www.blogjava.net/jikey/aggbug/325351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-07-06 11:33 <a href="http://www.blogjava.net/jikey/archive/2010/07/06/325351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate中lazy的使用 </title><link>http://www.blogjava.net/jikey/archive/2010/06/10/323256.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Thu, 10 Jun 2010 09:47:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/06/10/323256.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/323256.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/06/10/323256.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/323256.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/323256.html</trackback:ping><description><![CDATA[来自于：http://www.cnblogs.com/linbaoji/archive/2009/01/07/1370919.html<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><br />
<br />
lazy，延迟加载<br />
<br />
Lazy的有效期：只有在session打开的时候才有效；session关闭后lazy就没效了。<br />
<br />
lazy策略可以用在：<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">class</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">标签上：可以取值true</span><span style="color: #808080;">/</span><span style="color: #000000;">false<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">property</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">标签上，可以取值true</span><span style="color: #808080;">/</span><span style="color: #000000;">false，这个特性需要类增强<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #0000ff;">set</span><span style="color: #808080;">&gt;/&lt;</span><span style="color: #000000;">list</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">等集合上，可以取值为true</span><span style="color: #808080;">/</span><span style="color: #000000;">false</span><span style="color: #808080;">/</span><span style="color: #000000;">extra<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">one</span><span style="color: #808080;">-</span><span style="color: #0000ff;">to</span><span style="color: #808080;">-</span><span style="color: #000000;">one</span><span style="color: #808080;">&gt;/&lt;</span><span style="color: #000000;">many</span><span style="color: #808080;">-</span><span style="color: #0000ff;">to</span><span style="color: #808080;">-</span><span style="color: #000000;">one</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">等标签上，可以取值false</span><span style="color: #808080;">/</span><span style="color: #000000;">proxy</span><span style="color: #808080;">/</span><span style="color: #000000;">no</span><span style="color: #808080;">-</span><span style="color: #000000;">proxy<br />
<br />
</span><span style="color: #800000; font-weight: bold;">6.1</span><span style="color: #000000;">&nbsp;get和load的区别：<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;get不支持延迟加载，而load支持。<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;当查询特定的数据库中不存在的数据时，get会返回null，而load则抛出异常。<br />
<br />
</span><span style="color: #800000; font-weight: bold;">6.2</span><span style="color: #000000;">&nbsp;类(Class)的延迟加载：<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;设置</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">class</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">标签中的lazy</span><span style="color: #808080;">=</span><span style="color: #000000;">"true",或是保持默认（即不配置lazy属性)<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;如果lazy的属性值为true，那么在使用load方法加载数据时，只有确实用到数据的时候才会发出sql语句；这样有可能减少系统的开销。<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">//</span><span style="color: #000000;">不会发出查询sql<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("</span><span style="color: #0000ff;">group</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #000000;">"&nbsp;</span><span style="color: #808080;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">group</span><span style="color: #000000;">.getId());<br />
<br />
这里有一个问题，为什么加载主键的时候不需要发出sql语句。<br />
<br />
</span><span style="color: #800000; font-weight: bold;">6.3</span><span style="color: #000000;">&nbsp;集合(collection)的延迟加载：可以取值true，false，extra<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;保持集合上的lazy的默认值，此时的效果和lazy</span><span style="color: #808080;">=</span><span style="color: #000000;">"extra"是基本一样的。<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;设置集合上的lazy</span><span style="color: #808080;">=</span><span style="color: #000000;">extra,此时的效果和lazy属性的默认值是基本一样的。但是推荐使用这个属性值，因为在统计时这种情况显得比较智能。当然延迟是有效果的。<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;设置集合上的lazy</span><span style="color: #808080;">=</span><span style="color: #000000;">false<br />
<br />
true:默认取值，它的意思是只有在调用这个集合获取里面的元素对象时，才发出查询语句，加载其集合元素的数据<br />
<br />
false:取消懒加载特性，即在加载对象的同时，就发出第二条查询语句加载其关联集合的数据<br />
<br />
extra:一种比较聪明的懒加载策略，即调用集合的size</span><span style="color: #808080;">/</span><span style="color: #000000;">contains等方法的时候，hibernate<br />
<br />
并不会去加载整个集合的数据，而是发出一条聪明的SQL语句，以便获得需要的值，只有在真正需要用到这些集合元素对象数据的时候，才去发出查询语句加载所有对象的数据<br />
<br />
</span><span style="color: #800000; font-weight: bold;">6.4</span><span style="color: #000000;">&nbsp;Hibernate单端关联懒加载策略：即在</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">one</span><span style="color: #808080;">-</span><span style="color: #0000ff;">to</span><span style="color: #808080;">-</span><span style="color: #000000;">one</span><span style="color: #808080;">&gt;/&lt;</span><span style="color: #000000;">many</span><span style="color: #808080;">-</span><span style="color: #0000ff;">to</span><span style="color: #808080;">-</span><span style="color: #000000;">one</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">标签上可以配置<br />
<br />
懒加载策略。可以取值为：false</span><span style="color: #808080;">/</span><span style="color: #000000;">proxy</span><span style="color: #808080;">/</span><span style="color: #000000;">no</span><span style="color: #808080;">-</span><span style="color: #000000;">proxy<br />
<br />
false:取消懒加载策略，即在加载对象的同时，发出查询语句，加载其关联对象<br />
<br />
proxy:这是hibernate对单端关联的默认懒加载策略，即只有在调用到其关联对象的方法的时候才真正发出查询语句查询其对象数据，其关联对象是代理类<br />
<br />
no</span><span style="color: #808080;">-</span><span style="color: #000000;">proxy:这种懒加载特性需要对类进行增强，使用no</span><span style="color: #808080;">-</span><span style="color: #000000;">proxy，其关联对象不是代理类<br />
<br />
注意：在class标签上配置的lazy属性不会影响到关联对象!!!<br />
</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/jikey/aggbug/323256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-06-10 17:47 <a href="http://www.blogjava.net/jikey/archive/2010/06/10/323256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中Criteria的完整用法 </title><link>http://www.blogjava.net/jikey/archive/2010/06/10/323254.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Thu, 10 Jun 2010 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/06/10/323254.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/323254.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/06/10/323254.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/323254.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/323254.html</trackback:ping><description><![CDATA[源自于：http://www.blogjava.net/lifenote/archive/2008/03/12/185708.html<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">最近在项目中使用&nbsp;Spring&nbsp;和&nbsp;Hibernate&nbsp;进行开发，有感于&nbsp;Criteria&nbsp;比较好用，在查询方法<br />
<br />
设计上可以灵活的根据&nbsp;Criteria&nbsp;的特点来方便地进行查询条件的组装。现在对&nbsp;Hibernate的Criteria&nbsp;的用法进行总结：<br />
&nbsp;&nbsp;&nbsp;Hibernate&nbsp;设计了&nbsp;CriteriaSpecification&nbsp;作为&nbsp;Criteria&nbsp;的父接口，下面提供了&nbsp;Criteria和DetachedCriteria&nbsp;。<br />
&nbsp;&nbsp;&nbsp;Criteria&nbsp;和&nbsp;DetachedCriteria&nbsp;的主要区别在于创建的形式不一样，&nbsp;Criteria&nbsp;是在线的，所<br />
以它是由&nbsp;Hibernate&nbsp;Session&nbsp;进行创建的；而&nbsp;DetachedCriteria&nbsp;是离线的，创建时无需<br />
Session，DetachedCriteria&nbsp;提供了&nbsp;</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;个静态方法&nbsp;forClass(Class)&nbsp;或&nbsp;forEntityName(Name)<br />
进行DetachedCriteria&nbsp;实例的创建。&nbsp;Spring&nbsp;的框架提供了getHibernateTemplate<br />
().findByCriteria(detachedCriteria)&nbsp;方法可以很方便地根据DetachedCriteria&nbsp;来返回查询结<br />
果。<br />
&nbsp;&nbsp;&nbsp;Criteria&nbsp;和&nbsp;DetachedCriteria&nbsp;均可使用&nbsp;Criterion&nbsp;和&nbsp;Projection&nbsp;设置查询条件。可以设<br />
置&nbsp;FetchMode(&nbsp;联合查询抓取的模式&nbsp;)&nbsp;，设置排序方式。对于&nbsp;Criteria&nbsp;还可以设置&nbsp;FlushModel<br />
（冲刷&nbsp;Session&nbsp;的方式）和&nbsp;LockMode&nbsp;（数据库锁模式）。<br />
下面对&nbsp;Criterion&nbsp;和&nbsp;Projection&nbsp;进行详细说明。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criterion&nbsp;是&nbsp;Criteria&nbsp;的查询条件。Criteria&nbsp;提供了&nbsp;</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(Criterion&nbsp;criterion)&nbsp;方法来<br />
添加查询条件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criterion&nbsp;接口的主要实现包括：&nbsp;Example&nbsp;、&nbsp;Junction&nbsp;和&nbsp;SimpleExpression&nbsp;。而<br />
Junction&nbsp;的实际使用是它的两个子类&nbsp;conjunction&nbsp;和&nbsp;disjunction&nbsp;，分别是使用&nbsp;</span><span style="color: #808080;">AND</span><span style="color: #000000;">&nbsp;和&nbsp;</span><span style="color: #808080;">OR</span><span style="color: #000000;">&nbsp;操<br />
作符进行来联结查询条件集合。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criterion&nbsp;的实例可以通过&nbsp;Restrictions&nbsp;工具类来创建，Restrictions&nbsp;提供了大量的静态<br />
方法，如&nbsp;eq&nbsp;（等于）、&nbsp;ge&nbsp;（大于等于）、&nbsp;</span><span style="color: #808080;">between</span><span style="color: #000000;">&nbsp;等来方法的创建&nbsp;Criterion&nbsp;查询条件<br />
（SimpleExpression&nbsp;实例）。除此之外，&nbsp;Restrictions&nbsp;还提供了方法来创建&nbsp;conjunction&nbsp;和<br />
disjunction&nbsp;实例，通过往该实例的&nbsp;</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(Criteria)&nbsp;方法来增加查询条件形成一个查询条件集合<br />
。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;至于&nbsp;Example&nbsp;的创建有所不同，&nbsp;Example&nbsp;本身提供了一个静态方法&nbsp;</span><span style="color: #0000ff;">create</span><span style="color: #000000;">(Object<br />
entity)&nbsp;，即根据一个对象（实际使用中一般是映射到数据库的对象）来创建。然后可以设置一些<br />
过滤条件：<br />
Example&nbsp;exampleUser&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">Example.</span><span style="color: #0000ff;">create</span><span style="color: #000000;">(u)<br />
.ignoreCase()&nbsp;</span><span style="color: #808080;">//</span><span style="color: #000000;">&nbsp;忽略大小写<br />
.enableLike(MatchMode.ANYWHERE);<br />
</span><span style="color: #808080;">//</span><span style="color: #000000;">&nbsp;对&nbsp;String&nbsp;类型的属性，无论在那里值在那里都匹配。相当于&nbsp;</span><span style="color: #808080;">%</span><span style="color: #000000;">value</span><span style="color: #808080;">%</span><span style="color: #000000;"><br />
&nbsp;&nbsp;Project&nbsp;主要是让&nbsp;Criteria&nbsp;能够进行报表查询，并可以实现分组。&nbsp;Project&nbsp;主要有<br />
SimpleProjection&nbsp;、&nbsp;ProjectionList&nbsp;和&nbsp;Property&nbsp;三个实现。其中&nbsp;SimpleProjection&nbsp;和<br />
ProjectionList&nbsp;的实例化是由内建的&nbsp;Projections&nbsp;来完成，如提供的&nbsp;</span><span style="color: #ff00ff;">avg</span><span style="color: #000000;">&nbsp;、&nbsp;</span><span style="color: #ff00ff;">count</span><span style="color: #000000;">&nbsp;、&nbsp;</span><span style="color: #ff00ff;">max</span><span style="color: #000000;">&nbsp;、<br />
</span><span style="color: #ff00ff;">min</span><span style="color: #000000;">&nbsp;、&nbsp;</span><span style="color: #ff00ff;">sum</span><span style="color: #000000;">&nbsp;可以让开发者很容易对某个字段进行统计查询。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Property&nbsp;是对某个字段进行查询条件的设置，如通过Porperty.forName(&#8220;color&#8221;).</span><span style="color: #808080;">in</span><span style="color: #000000;"><br />
(new&nbsp;String</span><span style="color: #ff0000;">[]</span><span style="color: #000000;">{&#8220;black&#8221;,&#8221;red&#8221;,&#8221;write&#8221;});&nbsp;则可以创建一个&nbsp;Project&nbsp;实例。通过<br />
criteria&nbsp;的&nbsp;</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(Project)&nbsp;方法加入到查询条件中去。<br />
&nbsp;&nbsp;&nbsp;&nbsp;使用&nbsp;Criteria&nbsp;进行查询，主要要清晰的是&nbsp;Hibernate&nbsp;提供了那些类和方法来满足开发中查<br />
询条件的创建和组装，下面介绍几种用法：<br />
</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">.&nbsp;创建一个Criteria&nbsp;实例<br />
org.hibernate.Criteria接口表示特定持久类的一个查询。Session是&nbsp;Criteria实例的工厂。<br />
Criteria&nbsp;crit&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class);<br />
crit.setMaxResults(</span><span style="color: #800000; font-weight: bold;">50</span><span style="color: #000000;">);<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;crit.list();<br />
&nbsp;<br />
</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">.&nbsp;限制结果集内容<br />
一个单独的查询条件是org.hibernate.criterion.Criterion&nbsp;接口的一个实例。<br />
<br />
org.hibernate.criterion.Restrictions类&nbsp;定义了获得某些内置Criterion类型的工厂方法。<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">like</span><span style="color: #000000;">("name",&nbsp;"Fritz</span><span style="color: #808080;">%</span><span style="color: #000000;">")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">between</span><span style="color: #000000;">("weight",&nbsp;minWeight,&nbsp;maxWeight)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
约束可以按逻辑分组。<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">like</span><span style="color: #000000;">("name",&nbsp;"Fritz</span><span style="color: #808080;">%</span><span style="color: #000000;">")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">or</span><span style="color: #000000;">(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Restrictions.eq(&nbsp;"age",&nbsp;new&nbsp;</span><span style="color: #000000; font-weight: bold;">Integer</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">)&nbsp;),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Restrictions.</span><span style="color: #ff00ff;">isNull</span><span style="color: #000000;">("age")<br />
&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">in</span><span style="color: #000000;">(&nbsp;"name",&nbsp;new&nbsp;String</span><span style="color: #ff0000;">[]</span><span style="color: #000000;">&nbsp;{&nbsp;"Fritz",&nbsp;"Izi",&nbsp;"Pk"&nbsp;}&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.disjunction()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #ff00ff;">isNull</span><span style="color: #000000;">("age")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.eq("age",&nbsp;new&nbsp;</span><span style="color: #000000; font-weight: bold;">Integer</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.eq("age",&nbsp;new&nbsp;</span><span style="color: #000000; font-weight: bold;">Integer</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.eq("age",&nbsp;new&nbsp;</span><span style="color: #000000; font-weight: bold;">Integer</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
Hibernate提供了相当多的内置criterion类型(Restrictions&nbsp;子类),&nbsp;但是尤其有用的是可以允许<br />
<br />
你直接使用SQL。<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.sql("</span><span style="color: #ff00ff;">lower</span><span style="color: #000000;">({alias}.name)&nbsp;</span><span style="color: #808080;">like</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff00ff;">lower</span><span style="color: #000000;">(?)",&nbsp;"Fritz</span><span style="color: #808080;">%</span><span style="color: #000000;">",<br />
<br />
Hibernate.STRING)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
{alias}占位符应当被替换为被查询实体的列别名。<br />
Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName()&nbsp;创建一个<br />
<br />
Property。<br />
&nbsp;<br />
&nbsp;&nbsp;Property&nbsp;age&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;Property.forName("age");<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.disjunction()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;age.</span><span style="color: #ff00ff;">isNull</span><span style="color: #000000;">()&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;age.eq(&nbsp;new&nbsp;</span><span style="color: #000000; font-weight: bold;">Integer</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;age.eq(&nbsp;new&nbsp;</span><span style="color: #000000; font-weight: bold;">Integer</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;age.eq(&nbsp;new&nbsp;</span><span style="color: #000000; font-weight: bold;">Integer</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("name").</span><span style="color: #808080;">in</span><span style="color: #000000;">(&nbsp;new&nbsp;String</span><span style="color: #ff0000;">[]</span><span style="color: #000000;">&nbsp;{&nbsp;"Fritz",&nbsp;"Izi",&nbsp;"Pk"&nbsp;}&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">.&nbsp;结果集排序<br />
你可以使用org.hibernate.criterion.Order来为查询结果排序。<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">like</span><span style="color: #000000;">("name",&nbsp;"F</span><span style="color: #808080;">%</span><span style="color: #000000;">")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">asc</span><span style="color: #000000;">("name")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">desc</span><span style="color: #000000;">("age")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setMaxResults(</span><span style="color: #800000; font-weight: bold;">50</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("name").</span><span style="color: #808080;">like</span><span style="color: #000000;">("F</span><span style="color: #808080;">%</span><span style="color: #000000;">")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Property.forName("name").</span><span style="color: #0000ff;">asc</span><span style="color: #000000;">()&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Property.forName("age").</span><span style="color: #0000ff;">desc</span><span style="color: #000000;">()&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setMaxResults(</span><span style="color: #800000; font-weight: bold;">50</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">.&nbsp;关联<br />
你可以使用createCriteria()非常容易的在互相关联的实体间建立&nbsp;约束。<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">like</span><span style="color: #000000;">("name",&nbsp;"F</span><span style="color: #808080;">%</span><span style="color: #000000;">")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria("kittens")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">like</span><span style="color: #000000;">("name",&nbsp;"F</span><span style="color: #808080;">%</span><span style="color: #000000;">")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
注意第二个&nbsp;createCriteria()返回一个新的&nbsp;Criteria实例，该实例引用kittens&nbsp;集合中的元素。<br />
接下来，替换形态在某些情况下也是很有用的。<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createAlias("kittens",&nbsp;"kt")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createAlias("mate",&nbsp;"mt")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.eqProperty("kt.name",&nbsp;"mt.name")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
(createAlias()并不创建一个新的&nbsp;Criteria实例。)<br />
Cat实例所保存的之前两次查询所返回的kittens集合是&nbsp;没有被条件预过滤的。如果你希望只获得<br />
<br />
符合条件的kittens，&nbsp;你必须使用returnMaps()。<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria("kittens",&nbsp;"kt")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.eq("name",&nbsp;"F</span><span style="color: #808080;">%</span><span style="color: #000000;">")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.returnMaps()<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
Iterator&nbsp;iter&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;cats.iterator();<br />
</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(&nbsp;iter.hasNext()&nbsp;)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;(Map)&nbsp;iter.</span><span style="color: #0000ff;">next</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;cat&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;(Cat)&nbsp;map.get(Criteria.ROOT_ALIAS);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;kitten&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;(Cat)&nbsp;map.get("kt");<br />
}<br />
<br />
</span><span style="color: #800000; font-weight: bold;">5</span><span style="color: #000000;">.&nbsp;动态关联抓取<br />
你可以使用setFetchMode()在运行时定义动态关联抓取的语义。<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">like</span><span style="color: #000000;">("name",&nbsp;"Fritz</span><span style="color: #808080;">%</span><span style="color: #000000;">")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setFetchMode("mate",&nbsp;FetchMode.EAGER)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setFetchMode("kittens",&nbsp;FetchMode.EAGER)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
这个查询可以通过外连接抓取mate和kittens。<br />
&nbsp;<br />
</span><span style="color: #800000; font-weight: bold;">6</span><span style="color: #000000;">.&nbsp;查询示例<br />
org.hibernate.criterion.Example类允许你通过一个给定实例&nbsp;构建一个条件查询。<br />
&nbsp;<br />
Cat&nbsp;cat&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;new&nbsp;Cat();<br />
cat.setSex(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">F</span><span style="color: #ff0000;">'</span><span style="color: #000000;">);<br />
cat.setColor(Color.BLACK);<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Example.</span><span style="color: #0000ff;">create</span><span style="color: #000000;">(cat)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。<br />
可以自行调整Example使之更实用。<br />
&nbsp;<br />
Example&nbsp;example&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;Example.</span><span style="color: #0000ff;">create</span><span style="color: #000000;">(cat)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.excludeZeroes()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//</span><span style="color: #000000;">exclude&nbsp;zero&nbsp;valued&nbsp;properties<br />
&nbsp;&nbsp;&nbsp;&nbsp;.excludeProperty("color")&nbsp;&nbsp;</span><span style="color: #808080;">//</span><span style="color: #000000;">exclude&nbsp;the&nbsp;property&nbsp;named&nbsp;"color"<br />
&nbsp;&nbsp;&nbsp;&nbsp;.ignoreCase()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//</span><span style="color: #000000;">perform&nbsp;</span><span style="color: #ff00ff;">case</span><span style="color: #000000;">&nbsp;insensitive&nbsp;string&nbsp;comparisons<br />
&nbsp;&nbsp;&nbsp;&nbsp;.enableLike();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//</span><span style="color: #0000ff;">use</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">like</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;string&nbsp;comparisons<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(example)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
甚至可以使用examples在关联对象上放置条件。<br />
&nbsp;<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Example.</span><span style="color: #0000ff;">create</span><span style="color: #000000;">(cat)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria("mate")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Example.</span><span style="color: #0000ff;">create</span><span style="color: #000000;">(&nbsp;cat.getMate()&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
</span><span style="color: #800000; font-weight: bold;">7</span><span style="color: #000000;">.&nbsp;投影(Projections)、聚合（aggregation）和分组（</span><span style="color: #ff00ff;">grouping</span><span style="color: #000000;">）<br />
org.hibernate.criterion.Projections是&nbsp;Projection&nbsp;的实例工厂。我们通过调用<br />
<br />
setProjection()应用投影到一个查询。<br />
&nbsp;<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.</span><span style="color: #0000ff;">rowCount</span><span style="color: #000000;">()&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.eq("color",&nbsp;Color.BLACK)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.</span><span style="color: #0000ff;">rowCount</span><span style="color: #000000;">()&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.</span><span style="color: #ff00ff;">avg</span><span style="color: #000000;">("weight")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.</span><span style="color: #ff00ff;">max</span><span style="color: #000000;">("weight")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.groupProperty("color")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
<br />
在一个条件查询中没有必要显式的使用&nbsp;"</span><span style="color: #0000ff;">group</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">by</span><span style="color: #000000;">"&nbsp;。某些投影类型就是被定义为&nbsp;分组投影，他<br />
<br />
们也出现在SQL的group&nbsp;by子句中。<br />
<br />
可以选择把一个别名指派给一个投影，这样可以使投影值被约束或排序所引用。下面是两种不同的<br />
<br />
实现方式：<br />
&nbsp;<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.alias(&nbsp;Projections.groupProperty("color"),&nbsp;"colr"&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">asc</span><span style="color: #000000;">("colr")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.groupProperty("color").</span><span style="color: #0000ff;">as</span><span style="color: #000000;">("colr")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">asc</span><span style="color: #000000;">("colr")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
alias()和as()方法简便的将一个投影实例包装到另外一个&nbsp;别名的Projection实例中。简而言之，<br />
<br />
当你添加一个投影到一个投影列表中时&nbsp;你可以为它指定一个别名：<br />
&nbsp;<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.</span><span style="color: #0000ff;">rowCount</span><span style="color: #000000;">(),&nbsp;"catCountByColor"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.</span><span style="color: #ff00ff;">avg</span><span style="color: #000000;">("weight"),&nbsp;"avgWeight"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.</span><span style="color: #ff00ff;">max</span><span style="color: #000000;">("weight"),&nbsp;"maxWeight"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.groupProperty("color"),&nbsp;"color"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">desc</span><span style="color: #000000;">("catCountByColor")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">desc</span><span style="color: #000000;">("avgWeight")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Domestic.class,&nbsp;"cat")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createAlias("kittens",&nbsp;"kit")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.property("cat.name"),&nbsp;"catName"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.property("kit.name"),&nbsp;"kitName"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">asc</span><span style="color: #000000;">("catName")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">asc</span><span style="color: #000000;">("kitName")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
也可以使用Property.forName()来表示投影：<br />
&nbsp;<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Property.forName("name")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("color").eq(Color.BLACK)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.</span><span style="color: #0000ff;">rowCount</span><span style="color: #000000;">().</span><span style="color: #0000ff;">as</span><span style="color: #000000;">("catCountByColor")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("weight").</span><span style="color: #ff00ff;">avg</span><span style="color: #000000;">().</span><span style="color: #0000ff;">as</span><span style="color: #000000;">("avgWeight")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("weight").</span><span style="color: #ff00ff;">max</span><span style="color: #000000;">().</span><span style="color: #0000ff;">as</span><span style="color: #000000;">("maxWeight")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("color").</span><span style="color: #0000ff;">group</span><span style="color: #000000;">().</span><span style="color: #0000ff;">as</span><span style="color: #000000;">("color"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">desc</span><span style="color: #000000;">("catCountByColor")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">desc</span><span style="color: #000000;">("avgWeight")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
</span><span style="color: #800000; font-weight: bold;">8</span><span style="color: #000000;">.&nbsp;离线(detached)查询和子查询<br />
DetachedCriteria类使你在一个session范围之外创建一个查询，并且可以使用任意的&nbsp;Session来<br />
<br />
执行它。<br />
&nbsp;<br />
DetachedCriteria&nbsp;query&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;DetachedCriteria.forClass(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("sex").eq(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">F</span><span style="color: #ff0000;">'</span><span style="color: #000000;">)&nbsp;);<br />
</span><span style="color: #808080;">//</span><span style="color: #000000;">创建一个Session<br />
Session&nbsp;session&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;.;<br />
</span><span style="color: #0000ff;">Transaction</span><span style="color: #000000;">&nbsp;txn&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.beginTransaction();<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;query.getExecutableCriteria(session).setMaxResults(</span><span style="color: #800000; font-weight: bold;">100</span><span style="color: #000000;">).list();<br />
txn.</span><span style="color: #0000ff;">commit</span><span style="color: #000000;">();<br />
session.</span><span style="color: #0000ff;">close</span><span style="color: #000000;">();<br />
<br />
<br />
DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过&nbsp;Subqueries或者<br />
Property获得。<br />
&nbsp;<br />
DetachedCriteria&nbsp;avgWeight&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;DetachedCriteria.forClass(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Property.forName("weight").</span><span style="color: #ff00ff;">avg</span><span style="color: #000000;">()&nbsp;);<br />
session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("weight).gt(avgWeight)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
DetachedCriteria&nbsp;weights&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;DetachedCriteria.forClass(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Property.forName("weight")&nbsp;);<br />
session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Subqueries.geAll("weight",&nbsp;weights)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
相互关联的子查询也是有可能的：<br />
&nbsp;<br />
DetachedCriteria&nbsp;avgWeightForSex&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;DetachedCriteria.forClass(Cat.class,&nbsp;"cat2")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Property.forName("weight").</span><span style="color: #ff00ff;">avg</span><span style="color: #000000;">()&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("cat2.sex").eqProperty("cat.sex")&nbsp;);<br />
session.createCriteria(Cat.class,&nbsp;"cat")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("weight).gt(avgWeightForSex)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/jikey/aggbug/323254.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-06-10 17:44 <a href="http://www.blogjava.net/jikey/archive/2010/06/10/323254.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中国java开源界最可爱的人们【转】</title><link>http://www.blogjava.net/jikey/archive/2010/06/09/323197.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Wed, 09 Jun 2010 14:08:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/06/09/323197.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/323197.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/06/09/323197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/323197.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/323197.html</trackback:ping><description><![CDATA[http://space.itpub.net/11310314/viewspace-178<br />
<div>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;">记得去年某世界级的大师到中国忽悠几天后回去说，中国只是<a href="javascript:;" onclick="javascript:tagshow(event, '%BF%AA%D4%B4');" target="_self"><u><strong>开源</strong></u></a>&#8220;消费者&#8221;，那话的意思好像我们只会从开源社区中索取，
不懂得贡献似的。那么实际情况又是如何呢？这是昨晚整理的中国</span><a href="javascript:;" onclick="javascript:tagshow(event, 'Java');" target="_self"><u><strong>Java</strong></u></a><span style="font-family: 宋体;">开源领域的斗士们的情况，根据他们对中国</span>java<span style="font-family: 宋体;">开源界的贡献值、重要性、发展潜力等作了一个综合评价，可以说他们是中国</span>Java<span>开源界里最可爱的人。欢迎大家来看看这里是否有你认识英雄。<br />
<br />
<strong>1、&nbsp; Huihoo动力—当之无愧的老大</strong>&nbsp;</span></p>
<p style="margin-left: 21pt;"><span style="font-family: 宋体;"><strong>代表人物：</strong>龙辉</span>(Allen)<span style="font-size: 10pt; color: #cc0033; font-family: 宋体;">、</span><span style="font-family: 宋体;">程勇</span>(Peter)<span style="font-family: 宋体;">、杨泳</span>(Orbat)</p>
<p style="margin-left: 21pt;"><strong><span style="font-family: 宋体;">代表项目：</span></strong>JFox<span style="font-family: 宋体;">等</span></p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">官方网站：</span></strong><a href="http://www.huihoo.org/" target="_blank">http://www.huihoo.org/</a></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;"><strong>简评：</strong>说到</span>java<span style="font-family: 宋体;">开源，大家不可能不知道</span>Huihoo<span style="font-family: 宋体;">，</span>Huihoo<span style="font-family: 宋体;">曾经创造了很多奇迹，不管是对是团队成员的技术水平还是开源理念、开源组织的管理等都可以说是最棒
的，</span>JFox<span style="font-family: 宋体;">项目
一直具有生命力，</span>huihoo<span style="font-family: 宋体;">这么多年了也一直具有生命力，</span>Allen<span style="font-family: 宋体;">、</span>Peter<span style="font-family: 宋体;">、</span>Orbat<span style="font-family: 宋体;">等对这个团队这么多年来的坚持及贡献，要选国内最值得推崇的开源团体，</span>huihoo排在第一位可以说是当之无愧。因此，他们是最可爱的人。<br />
&nbsp;</p>
<p style="text-indent: 21pt;"><strong>2<span style="font-family: 宋体;">、</span>Jdon<span style="font-family: 宋体;">—</span><span style="font-family: 宋体;">高处不胜寒</span></strong></p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">代表人物：</span></strong><span style="font-size: 9pt; font-family: 宋体;">彭晨阳</span><span style="font-size: 9pt; font-family: Arial;">(</span><span style="font-size: 9pt; font-family: 宋体;">板桥里人</span><span style="font-size: 9pt; font-family: Arial;">)</span></p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">代表项目：</span></strong>jdonframework</p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">官方网站：</span></strong><a href="http://www.jdon.com/" target="_blank">http://www.jdon.com/</a></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;"><strong>简评：</strong>作为国内第一个开源框架的发起人，作为国内第一个敢于与国外框架叫板的板桥里人，他曾经带给大家很多
很多的欣喜及回忆，桥技术水平及造诣这里就更不用说了，他&#8220;</span><span style="font-family: 宋体;">一个开源人的
孤独告白&#8221;，有点沧桑，有点心寒，</span>jdon<span style="font-family: 宋体;">今天的现状，是中国对待技术人才的真实写照。无论如何，选中国</span>Java开源界最可爱的人，板桥当之无愧。<br />
&nbsp;</p>
<p style="text-indent: 21pt;"><strong>3<span style="font-family: 宋体;">、</span>Apusic OperaMasks<span style="font-family: 宋体;">—</span><span style="font-family: 宋体;">谁说开源不赚钱</span></strong></p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">代表人物：</span></strong><span style="font-family: 宋体;">袁红岗　张勇</span></p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">代表项目：</span></strong>OperaMasks</p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">官方网站：</span></strong><a href="http://www.operamasks.org/" target="_blank">http://www.operamasks.org/</a></p>
<p><strong><span style="font-family: 宋体;">　　简评：</span></strong>1000<span style="font-family: 宋体;">万人民币的投入，一篇&#8220;勇敢者的新
世界&#8221;也算是在中国开源界掀起了一阵波澜，产品发布会上那一份份合同，更是让同行的老总们有点眼红。除去商业因素不说，这两天</span>Check out<span style="font-family: 宋体;">了</span>OperaMasks<span style="font-family: 宋体;">的代码，也看了示例，
表现非常不错，值得深层次的</span>java<span style="font-family: 宋体;">开发人员学习。老袁深厚的技术功底、老张卖力的全国路演，公司经营战略的成功，</span>OperaMasks<span>能否发展成为一个最能适合中国国情的开源组织，
让我们拭目以待。<br />
</span></p>
<p><strong>4<span style="font-family: 宋体;">、</span>EasyJF<span style="font-family: 宋体;">—</span><span style="font-family: 宋体;">后生可畏</span></strong></p>
<p><span style="font-family: 宋体;">　　<strong>代表人物：</strong>蔡
世友</span>(<span style="font-family: 宋体;">大峡</span>)<span style="font-family: 宋体;">、吴嘉俊</span>(stef_wu)<span style="font-family: 宋体;">、程强</span>(<span style="font-family: 宋体;">天一</span>)</p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">代表项目：</span></strong>EasyJWeb</p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">官方网站：</span></strong><a href="http://www.easyjf.com/" target="_blank">http://www.easyjf.com</a></p>
<p><span style="font-family: 宋体;"><strong>　　简评：</strong>看
了大峡小朋友的一些文章，</span><span style="font-family: 宋体;">看到</span>EasyJF<span style="font-family: 宋体;">现在的发展，真真实实有一种后生
可畏的感叹。他们有自己的专职团队，有网下办公室，还有硬件设施，还拥有一群有激情、好学的年轻小伙子们。虽然要得到中国人自己的认可是很不容易的事情，
但搜索一下带是发现国内已经有不少网站在用</span>EasyJWeb做开发。因此，最可爱的人当他们莫属，衷心希望他们能成功。<br />
</p>
<p><strong>5<span style="font-family: 宋体;">、</span>SpringSide<span style="font-family: 宋体;">—</span><span style="font-family: 宋体;">天才团队</span></strong></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;"><strong>代表人物：</strong>肖
桦</span>(<span style="font-family: 宋体;">江南白衣</span>)<span style="font-family: 宋体;">、<a name="cac">陈俊</a></span>(cac)<span style="font-family: 宋体;">、田淼</span>(<span style="font-family: 宋体;">差沙</span>)</p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">代表项目：</span></strong>SpringSide</p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">官方网站：</span></strong><a href="http://www.springside.org.cn/" target="_blank">http://www.springside.org.cn/</a></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;"><strong>简评：</strong>虽然只是站在春天的傍边，但已经带给了整天忙于追逐新技术、新潮流的</span>Java<span style="font-family: 宋体;">程序员们很多极具参考价值的东西。江
南白衣同学可以算是一个天才般的人物，技术的攻底、接受并译释新技术的速度、能力及水平，可以说是少数中的少数。因此，</span>SpringSide<span style="font-family: 宋体;">可以称得上最具有偶像潜
质的团队，</span>Java<span>开源界最可爱的人，他们
当之无愧，希望他们能从&#8220;傍边&#8221;走到&#8220;中间&#8221;。<br />
</span></p>
<p style="text-indent: 21pt;"><strong>6<span style="font-family: 宋体;">、</span>Buffalo<span style="font-family: 宋体;">社区</span><span style="font-family: 宋体;">—</span><span style="font-family: 宋体;">浓缩是精</span></strong></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;"><strong>代表人物：</strong>陈
金洲</span>(Michael Chen)</p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">代表项目：</span></strong>Buffalo</p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">官方网站：<a href="http://buffalo.sourceforge.net/" target="_blank">http://buffalo.sourceforge.net/</a></span></strong></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;">简评：作为第一个国人开发的</span>Ajax<span style="font-family: 宋体;">框架，作为一个能把一直受</span>java<span style="font-family: 宋体;">大拿们岐视</span>javascript<span style="font-family: 宋体;">玩转得如何熟悉的项目，作为一个能几年坚持更新的开源项目，</span>Buffalo<span style="font-family: 宋体;">是成功的，</span>Michael Chen<span>让我们体会到国内开源贡献者们执着与坚持。
他是不是最可爱的人，谁是？<br />
&nbsp;</span></p>
<p style="text-indent: 21pt;"><strong>7<span style="font-family: 宋体;">、天乙社区</span><span style="font-family: 宋体;">—享受开
源</span><span style="font-family: 宋体;">动力</span></strong></p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">代表人物：</span></strong>laoer</p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;"><strong>代表项目：</strong>天乙开源社区</span></p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">官方网站：</span></strong><a href="http://www.laoer.com/" target="_blank">http://www.laoer.com/</a></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;"><strong>简评：</strong>有多少开源项目的产品发布到</span>8.0<span style="font-family: 宋体;">，从</span>jsp<span style="font-family: 宋体;">、</span>struts1<span style="font-family: 宋体;">到</span>struts2<span style="font-family: 宋体;">一路走来，一直能跟着新技术的步伐，不断改进及完善。因此，当之无愧</span>java开源界最可爱的人。<br />
</p>
<p style="text-indent: 21pt;"><strong>8<span style="font-family: 宋体;">、</span>CowNew<span style="font-family: 宋体;">开源</span><span style="font-family: 宋体;">—</span><span style="font-family: 宋体;">真有一点牛</span></strong></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;"><strong>代表人物：</strong>杨
中科</span></p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">代表项目：</span></strong>CowNewSQL</p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">官方网站：<a href="http://www.cownew.com/" target="_blank">http://www.cownew.com/</a></span></strong></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;"><strong>简评：</strong>看过杨中科同学的两篇文章，我觉得他是可爱的。多数据库翻译引擎</span>CowNewSQL<span style="font-family: 宋体;">的价值将在哪里体现？</span>CowNew<span>能在何时给我们带来更多实用的东西，值得大家期待。无论
如何，他们的进步是有目共睹。<br />
</span></p>
<p style="text-indent: 21pt;"><strong>9<span style="font-family: 宋体;">、</span>CommonTemplate<span style="font-family: 宋体;">—</span><span style="font-family: 宋体;">值得期待</span></strong></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;"><strong>代表人物：</strong>梁
飞</span>(javatar)</p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">代表项目：</span></strong>CommonTemplate</p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">官方网站：<a href="http://www.commontemplate.org/" target="_blank">http://www.commontemplate.org/</a></span></strong></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;"><strong>简评：</strong>也许很多人不知道这个项目，但他确实是一个很不错的模板引擎，金子总有发光的</span><span style="font-family: 宋体-方正超大字符集;">时候</span><span>。只要坚持，相信有一
天梁飞同学会给大家带来更多的惊喜。<br />
</span></p>
<p style="text-indent: 21pt;"><strong>10、恩信—小公司也能开源</strong><br />
</p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;"><strong>代表人物：</strong>刘有涛</span></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;"><strong>代表项目：</strong>恩
信开源</span>ERP</p>
<p style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">官方网站：</span></strong><a href="http://www.nseer.com/" target="_blank">http://www.nseer.com/</a></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;">简评：听过刘总的演讲，从&#8220;捕鱼&#8221;到&#8220;</span><span style="font-family: 宋体;">授之以渔&#8221;，从刘总一系
列运作手法，我觉得恩信可以成为很多追逐开源但又没有上千万资金来投入而总在为是否参加开源而徘徊的老总们的参考学习的案例。虽然没有技术牛人加盟，虽然
还使用稍为古老的技术体系，但既然开源了，总能让我们学到很多东西。呵呵，所有最可爱的开源人中，刘总算是算是最年长的了，祝他们开源</span><span style="font-family: ˎ̥;">ERP</span>大卖。<br />
</p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;">除了上面</span>10<span style="font-family: 宋体;">个开源项目里面的最可爱的人以外，还有一些曾经激情一时并给大家带来快乐，但因为很多原因没能坚持下来的开源斗士们，这里就不逐一列出来，为他
们感到惋惜的同时，也希望有一天能看到更多的人与企业参与到开源的队伍中来。当然，可能还有一些比较优秀的团队我没有发现，而恰好你又知道，那么请您告诉
我，在今后的日子里我会尽我的力量也来做点贡献。</span></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;"><span style="color: red;"><span style="font-family: 宋体;">版权声明：本文版权由</span>Blogjava<span style="font-family: 宋体;">的<a href="../../rain2008/">小雨开源</a>所有，受法律保护。欢迎转载，转载请保留作者版权
声明及连接。</span></span></span></p>
</div>
<br />
<img src ="http://www.blogjava.net/jikey/aggbug/323197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-06-09 22:08 <a href="http://www.blogjava.net/jikey/archive/2010/06/09/323197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中mysql乱码</title><link>http://www.blogjava.net/jikey/archive/2010/06/08/323104.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Tue, 08 Jun 2010 15:21:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/06/08/323104.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/323104.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/06/08/323104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/323104.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/323104.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">connection.url</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">jdbc:mysql:</span><span style="color: #008000;">//</span><span style="color: #008000;">localhost:3306/test?useUnicode=true&amp;amp;characterEncoding=UTF-8&lt;/property&gt;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;乱码&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">connection.useUnicode</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">connection.characterEncoding</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">UTF</span><span style="color: #000000;">-</span><span style="color: #000000;">8</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> <br />
</span></div>
<img src ="http://www.blogjava.net/jikey/aggbug/323104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-06-08 23:21 <a href="http://www.blogjava.net/jikey/archive/2010/06/08/323104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>transient、 persistent、detached状态</title><link>http://www.blogjava.net/jikey/archive/2010/06/08/323100.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Tue, 08 Jun 2010 14:57:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/06/08/323100.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/323100.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/06/08/323100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/323100.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/323100.html</trackback:ping><description><![CDATA[来自于：http://www.blogjava.net/apple0668/archive/2008/10/09/233436.html<br />
<font style="background-color: #c7edcc;"><img alt="" src="../../images/blogjava_net/apple0668/hibernate/show_fpic.png" border="0" height="366" width="412" /></font><br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">transient</span><span style="color: #000000;">、persistent、&nbsp;detached状态关系图如下：<br />
<br />
<br />
<br />
</span><span style="color: #000000;">1</span><span style="color: #000000;">、transient状态的特征：<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;在数据库中没有与之匹配的数据<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;没有纳入session的管理<br />
&nbsp;<br />
</span><span style="color: #000000;">2</span><span style="color: #000000;">、persistent状态的特征：<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;persistent状态的对象在数据库中有与之匹配的数据<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;纳入了session的管理<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;在清理缓存（脏数据检查）的时候,会和数据库同步<br />
&nbsp;<br />
</span><span style="color: #000000;">3</span><span style="color: #000000;">、detached状态的特征：<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;在数据库中有与之匹配的数据<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;没有纳入session的管理&nbsp;<br />
<br />
PS：了解这几种状态对深入使用hibernate有比较大的意义，开发过程中减少很多不必要的错误。</span></div>
<br />
<img src ="http://www.blogjava.net/jikey/aggbug/323100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-06-08 22:57 <a href="http://www.blogjava.net/jikey/archive/2010/06/08/323100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SessionFactory的构建</title><link>http://www.blogjava.net/jikey/archive/2010/06/08/323096.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Tue, 08 Jun 2010 12:48:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/06/08/323096.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/323096.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/06/08/323096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/323096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/323096.html</trackback:ping><description><![CDATA[来自于：http://linweihan.javaeye.com/blog/144652<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">2.6</span><span style="color: #000000;">&nbsp;&nbsp;构建SessionFactory<br />
Hibernate的SessionFactory接口提供Session类的实例，Session类用于完成对数据库的操作。由于&nbsp;SessionFactory实例是线程安全的（而Session实例不是线程安全的），所以每个操作都可以共用同一个SessionFactory来获取Session。<br />
<br />
Hibernate配置文件分为两种格式，一种是xml格式的配置文件，另一种是Java属性文件格式的配置文件，因此构建SessionFactory也有两种方法，下面分别介绍。<br />
<br />
</span><span style="color: #000000;">2.6</span><span style="color: #000000;">.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;从XML文件读取配置信息构建&nbsp;SessionFactory<br />
从XML文件读取配置信息构建SessionFactory的具体步骤如下。<br />
<br />
（</span><span style="color: #000000;">1</span><span style="color: #000000;">）创建一个Configuration对象，并通过该对象的configura()方法加载Hibernate&nbsp;配置文件，代码如下。<br />
<br />
Configuration&nbsp;config&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Configuration().configure();<br />
<br />
configura()方法：用于告诉Hibernate加载hibernate.cfg.xml文件。&nbsp;Configuration在实例化时默认加载classpath中的hibernate.cfg.xml，当然也可以加载名称不是hibernate.cfg.xml的配置文件，例如wghhibernate.cfg.xml，可以通过以下代码实现。<br />
<br />
Configuration&nbsp;config&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Configuration().configure(</span><span style="color: #000000;">"</span><span style="color: #000000;">wghhibernate.cfg.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<br />
（</span><span style="color: #000000;">2</span><span style="color: #000000;">）完成配置文件和映射文件的加载后，将得到一个包括所有Hibernate运行期参数的&nbsp;Configuration实例，通过Configuration实例<br />
<br />
的buildSessionFactory()方法可以构建一个惟一的SessionFactory，代码如下。<br />
<br />
SessionFactory&nbsp;sessionFactory&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;config.buildSessionFactory();<br />
<br />
构建SessionFactory要放在静态代码块中，因为它只在该类被加载时执行一次。一个典型的构建&nbsp;SessionFactory的代码如下。<br />
<br />
例程2</span><span style="color: #000000;">-</span><span style="color: #000000;">9</span><span style="color: #000000;">：光盘\mr\</span><span style="color: #000000;">02</span><span style="color: #000000;">\sl\</span><span style="color: #000000;">09</span><span style="color: #000000;">\CoreSession.java<br />
<br />
java&nbsp;代码<br />
<br />
&nbsp; </span>import org.hibernate.*;&nbsp; &nbsp;<br />
&nbsp; <br />
import org.hibernate.cfg.*;&nbsp; &nbsp;<br />
&nbsp; <br />
public class CoreSession {&nbsp; &nbsp;<br />
&nbsp; <br />
static SessionFactory sessionFactory;&nbsp; &nbsp;<br />
//注意到这里的SessionFactory都是static的<br />
//初始化Hibernate,创建 SessionFactory实例,只在该类被加载到内存时执行一次&nbsp; &nbsp;<br />
&nbsp; <br />
static{&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; try{&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration config = new Configuration().configure();&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionFactory = config.buildSessionFactory();&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; } catch (Exception e) {&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e.getMessage());&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp; &nbsp;<br />
&nbsp; <br />
}&nbsp; &nbsp;<br />
&nbsp; <br />
}&nbsp;&nbsp; <br />
<span style="color: #000000;">&nbsp;<br />
<br />
</span><span style="color: #000000;">2.6</span><span style="color: #000000;">.</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;&nbsp;从Java属性文件读取配置信息构建SessionFactory<br />
从Java属性文件读取配置信息构建SessionFactory的具体步骤如下。<br />
<br />
（</span><span style="color: #000000;">1</span><span style="color: #000000;">）创建一个Configuration对象，此时Hibernate会默认加载classpath中的配置文件hibernate.properties，代码如下。<br />
<br />
Configuration&nbsp;config&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Configuration();<br />
<br />
（</span><span style="color: #000000;">2</span><span style="color: #000000;">）由于在配置文件中缺少相应的配置映射文件的信息，所以此处需要通过编码方式加载，这可以通过Configuration对象的<br />
<br />
addClass()方法实现，具体代码如下。<br />
<br />
config.addClass(BranchForm.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />
<br />
addClass()方法用于加载实体类。<br />
<br />
（</span><span style="color: #000000;">3</span><span style="color: #000000;">）完成配置文件和映射文件的加载后，将得到一个包括所有Hibernate运行期参数的Configuration实例，通过Configuration实例<br />
<br />
的buildSessionFactory()方法可以构建一个惟一的SessionFactory，代码如下。<br />
<br />
SessionFactory&nbsp;sessionFactory&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;config.buildSessionFactory();<br />
<br />
构建SessionFactory要放在静态代码块中，因为它只需在该类被加载时执行一次，一个典型的构建SessionFactory的代码如下。<br />
<br />
例程2</span><span style="color: #000000;">-</span><span style="color: #000000;">10</span><span style="color: #000000;">：光盘\mr\</span><span style="color: #000000;">02</span><span style="color: #000000;">\sl\</span><span style="color: #000000;">10</span><span style="color: #000000;">&nbsp;\CoreSession.java<br />
<br />
java&nbsp;代码<br />
</span><span style="color: #000000;"><br />
</span>import org.hibernate.*;&nbsp; &nbsp;<br />
&nbsp; <br />
import org.hibernate.cfg.*;&nbsp; &nbsp;<br />
&nbsp; <br />
public class CoreSession {&nbsp; &nbsp;<br />
&nbsp; <br />
static SessionFactory sessionFactory;&nbsp; &nbsp;<br />
&nbsp; <br />
//初始化Hibernate,创建 SessionFactory实例,只在该类被加载到内存时执行一次&nbsp; &nbsp;<br />
&nbsp; <br />
static{&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; try{&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration config = new Configuration();&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.addClass(BranchForm.class);&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionFactory = config.buildSessionFactory();&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; } catch (Exception e) {&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e.getMessage());&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp; &nbsp;<br />
&nbsp; <br />
}&nbsp; &nbsp;<br />
&nbsp; <br />
}&nbsp; <br />
<br />
</div>
<br />
<img src ="http://www.blogjava.net/jikey/aggbug/323096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-06-08 20:48 <a href="http://www.blogjava.net/jikey/archive/2010/06/08/323096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate主键生成方式 Key Generator</title><link>http://www.blogjava.net/jikey/archive/2010/06/07/322998.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Mon, 07 Jun 2010 14:10:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/06/07/322998.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/322998.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/06/07/322998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/322998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/322998.html</trackback:ping><description><![CDATA[来自于：http://letle.javaeye.com/blog/78530<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><br />
<br />
Hibernate主键生成方式&nbsp;&nbsp;Key&nbsp;Generator<br />
主键产生器<br />
可选项说明：<br />
</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;assigned<br />
主键由外部程序负责生成，无需Hibernate参与。<br />
<br />
</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;hilo<br />
通过hi</span><span style="color: #000000;">/</span><span style="color: #000000;">lo&nbsp;算法实现的主键生成机制，需要额外的数据库表保存主键生成历史状态。<br />
<br />
</span><span style="color: #000000;">3</span><span style="color: #000000;">)&nbsp;seqhilo<br />
与hilo&nbsp;类似，通过hi</span><span style="color: #000000;">/</span><span style="color: #000000;">lo&nbsp;算法实现的主键生成机制，只是主键历史状态保存在Sequence中，适用于支持Sequence的数据库，如Oracle。<br />
<br />
</span><span style="color: #000000;">4</span><span style="color: #000000;">)&nbsp;increment<br />
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量，以保存着当前的最大值，之后每次需要生成主键的时候<br />
将此值加1作为主键。<br />
这种方式可能产生的问题是：如果当前有多个实例访问同一个数据库，那么由于各个实例各自维护主键状态，不同实例可能生成同样的主键，从而造成主键重复异常。因此，如果同一数据库有多个实例访问，此方式必须避免使用。<br />
<br />
</span><span style="color: #000000;">5</span><span style="color: #000000;">)&nbsp;identity<br />
采用数据库提供的主键生成机制。如DB2、SQL&nbsp;Server、MySQL中的主键生成机制。<br />
<br />
</span><span style="color: #000000;">6</span><span style="color: #000000;">)&nbsp;sequence<br />
采用数据库提供的sequence&nbsp;机制生成主键。如Oralce&nbsp;中的Sequence。<br />
<br />
</span><span style="color: #000000;">7</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">native</span><span style="color: #000000;"><br />
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。<br />
<br />
</span><span style="color: #000000;">8</span><span style="color: #000000;">)&nbsp;uuid.hex<br />
由Hibernate基于128&nbsp;位唯一值产生算法生成16&nbsp;进制数值（编码后以长度32&nbsp;的字符串表示）作为主键。<br />
<br />
</span><span style="color: #000000;">9</span><span style="color: #000000;">)&nbsp;uuid.string<br />
与uuid.hex&nbsp;类似，只是生成的主键未进行编码（长度16）。在某些数据库中可能出现问题（如PostgreSQL）。<br />
<br />
</span><span style="color: #000000;">10</span><span style="color: #000000;">)&nbsp;foreign<br />
使用外部表的字段作为主键。<br />
一般而言，利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。<br />
<br />
另外由于常用的数据库，如Oracle、DB2、SQLServer、MySql&nbsp;等，都提供了易用的主键生成机制（Auto</span><span style="color: #000000;">-</span><span style="color: #000000;">Increase&nbsp;字段或者Sequence）。我们可以在数据库提供的主键生成机制上，采用generator</span><span style="color: #000000;">-</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">native的主键生成方式。不过值得注意的是，一些数据库提供的主键生成机制在效率上未必最佳，大量并发insert数据时可能会引起表之间的互锁。<br />
数据库提供的主键生成机制，往往是通过在一个内部表中保存当前主键状态（如对于自增型主键而言，此内部表中就维护着当前的最大值和递增量），之后每次插入数据会读取这个最大值，然后加上递增量作为新记录的主键，之后再把这个新的最大值更新回内部表中，这样，一次Insert操作可能导致数据库内部多次表读写操作，同时伴随的还有数据的加锁解锁操作，这对性能产生了较大影响。<br />
因此，对于并发Insert要求较高的系统，推荐采用uuid.hex&nbsp;作为主键生成机制。<br />
</span></div>
<br />
<img src ="http://www.blogjava.net/jikey/aggbug/322998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-06-07 22:10 <a href="http://www.blogjava.net/jikey/archive/2010/06/07/322998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>