﻿<?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/georgehill/</link><description>希望能和您交流Java编程的知识和见解</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 19:26:33 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 19:26:33 GMT</pubDate><ttl>60</ttl><item><title>由JComponent生成BufferedImage</title><link>http://www.blogjava.net/georgehill/archive/2006/04/14/41179.html</link><dc:creator>小米</dc:creator><author>小米</author><pubDate>Fri, 14 Apr 2006 15:41:00 GMT</pubDate><guid>http://www.blogjava.net/georgehill/archive/2006/04/14/41179.html</guid><wfw:comment>http://www.blogjava.net/georgehill/comments/41179.html</wfw:comment><comments>http://www.blogjava.net/georgehill/archive/2006/04/14/41179.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/georgehill/comments/commentRss/41179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/georgehill/services/trackbacks/41179.html</trackback:ping><description><![CDATA[最近在弄swing，需要由JComponent生成BufferedImage，在CSDN上发现一个好例子。下面是范例：<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">Rectangle rect </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> comp.getBounds();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> BufferedImage bufImage </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BufferedImage(rect.width,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />           rect.height,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />           BufferedImage.TYPE_INT_RGB);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> Graphics g </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> bufImage.getGraphics();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> g.translate(</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">rect.x, </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">rect.y);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> comp.paint(g);</span></div><br />这样，JComponent中的图像就保存到BufferedImage中了。<br />原文的链接：<a href="http://dev.csdn.net/article/13/13531.shtm">http://dev.csdn.net/article/13/13531.shtm</a><img src ="http://www.blogjava.net/georgehill/aggbug/41179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/georgehill/" target="_blank">小米</a> 2006-04-14 23:41 <a href="http://www.blogjava.net/georgehill/archive/2006/04/14/41179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重新开始写blog</title><link>http://www.blogjava.net/georgehill/archive/2006/03/29/38121.html</link><dc:creator>小米</dc:creator><author>小米</author><pubDate>Wed, 29 Mar 2006 11:43:00 GMT</pubDate><guid>http://www.blogjava.net/georgehill/archive/2006/03/29/38121.html</guid><wfw:comment>http://www.blogjava.net/georgehill/comments/38121.html</wfw:comment><comments>http://www.blogjava.net/georgehill/archive/2006/03/29/38121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/georgehill/comments/commentRss/38121.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/georgehill/services/trackbacks/38121.html</trackback:ping><description><![CDATA[        好久没有写blog了，距离上次写几乎已经是半年前的事情了。<img height="20" src="http://www.blogjava.net/Emoticons/QQ/15.gif" width="20" border="0" /> 这半年发生了不少事情。首先换了家公司，进了家金融企业，每天要西装革履的，一开始还真是不习惯。<img height="20" src="http://www.blogjava.net/Emoticons/QQ/02.gif" width="20" border="0" /> 这里开发是用的spring框架，以后要多研究研究spring的东西了。<br />        第二件事就是和恋爱了三年的女友结婚了，从此两人长相厮守，不知道时间久了会不会审美疲劳。呵呵。<img height="20" src="http://www.blogjava.net/Emoticons/QQ/13.gif" width="20" border="0" /><br />        第三件事就是在深圳买了自己的小房子，虽然是小小的两房，不过我们已经很知足了。<img height="20" src="http://www.blogjava.net/Emoticons/QQ/15.gif" width="20" border="0" /> 而且刚好是赶在房价大涨前买的，还算走了点运气。换到现在，都不知道去哪里买好了。<br />        在这里要向一些留言和发邮件给我的网友道歉，前段时间实在是太忙，没有空回复你们的信息和邮件。请原谅！<img height="20" src="http://www.blogjava.net/Emoticons/QQ/15.gif" width="20" border="0" /><img src ="http://www.blogjava.net/georgehill/aggbug/38121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/georgehill/" target="_blank">小米</a> 2006-03-29 19:43 <a href="http://www.blogjava.net/georgehill/archive/2006/03/29/38121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>好久没有更新博客了</title><link>http://www.blogjava.net/georgehill/archive/2005/08/10/9728.html</link><dc:creator>小米</dc:creator><author>小米</author><pubDate>Wed, 10 Aug 2005 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/georgehill/archive/2005/08/10/9728.html</guid><wfw:comment>http://www.blogjava.net/georgehill/comments/9728.html</wfw:comment><comments>http://www.blogjava.net/georgehill/archive/2005/08/10/9728.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/georgehill/comments/commentRss/9728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/georgehill/services/trackbacks/9728.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最近真是多事情忙，而且可能要忙到9月底。好久没有上来更新我的博客了，暂且发发牢骚。<IMG height=20 src="http://www.blogjava.net/Emoticons/QQ/19.gif" width=20 border=0><img src ="http://www.blogjava.net/georgehill/aggbug/9728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/georgehill/" target="_blank">小米</a> 2005-08-10 17:32 <a href="http://www.blogjava.net/georgehill/archive/2005/08/10/9728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《深入浅出Hibernate》读书笔记(9)——Session管理</title><link>http://www.blogjava.net/georgehill/archive/2005/07/29/8759.html</link><dc:creator>小米</dc:creator><author>小米</author><pubDate>Fri, 29 Jul 2005 11:43:00 GMT</pubDate><guid>http://www.blogjava.net/georgehill/archive/2005/07/29/8759.html</guid><wfw:comment>http://www.blogjava.net/georgehill/comments/8759.html</wfw:comment><comments>http://www.blogjava.net/georgehill/archive/2005/07/29/8759.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/georgehill/comments/commentRss/8759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/georgehill/services/trackbacks/8759.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这一节是非常实用的一节，我在阅读此书的时候，一直在迷惑，究竟应该怎样管理Session呢？因为Session的管理是如此重要，类似于以前写程序对JDBC Connection的管理。看完此节后，终于找到了方法。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在各种Session管理方案中，ThreadLocal模式得到了大量使用。ThreadLocal是Java中一种较为特殊的线程绑定机制。通过ThreadLocal存取的数据，总是与当前线程相关，也就是说，JVM为每个运行的线程，绑定了私有的本定实例存取空间，从而为多线程环境经常出现的并发访问问题提供了一种隔离机制。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是Hibernate官方提供的一个ThreadLocal工具：<BR><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;net.sf.hibernate.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;net.sf.hibernate.cfg.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>import&nbsp;org.apache.log4j.Logger;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_122_292_Open_Image onclick="this.style.display='none'; Codehighlighter1_122_292_Open_Text.style.display='none'; Codehighlighter1_122_292_Closed_Image.style.display='inline'; Codehighlighter1_122_292_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_122_292_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_122_292_Closed_Text.style.display='none'; Codehighlighter1_122_292_Open_Image.style.display='inline'; Codehighlighter1_122_292_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_122_292_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_122_292_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;&lt;p&gt;Title:&nbsp;&lt;/p&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;&lt;p&gt;Description:&nbsp;Session的管理类&lt;/p&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;&lt;p&gt;Copyright:&nbsp;Copyright&nbsp;(c)&nbsp;2005&lt;/p&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;&lt;p&gt;Company:&nbsp;&lt;/p&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;@author&nbsp;George&nbsp;Hill<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;@version&nbsp;1.0<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_322_1435_Open_Image onclick="this.style.display='none'; Codehighlighter1_322_1435_Open_Text.style.display='none'; Codehighlighter1_322_1435_Closed_Image.style.display='inline'; Codehighlighter1_322_1435_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_322_1435_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_322_1435_Closed_Text.style.display='none'; Codehighlighter1_322_1435_Open_Image.style.display='inline'; Codehighlighter1_322_1435_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;HibernateUtil&nbsp;</SPAN><SPAN id=Codehighlighter1_322_1435_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_322_1435_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;final&nbsp;Logger&nbsp;log&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;Logger.getLogger(HibernateUtil.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;final&nbsp;SessionFactory&nbsp;sessionFactory;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_458_486_Open_Image onclick="this.style.display='none'; Codehighlighter1_458_486_Open_Text.style.display='none'; Codehighlighter1_458_486_Closed_Image.style.display='inline'; Codehighlighter1_458_486_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_458_486_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_458_486_Closed_Text.style.display='none'; Codehighlighter1_458_486_Open_Image.style.display='inline'; Codehighlighter1_458_486_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_458_486_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_458_486_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;*&nbsp;初始化Hibernate配置<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_497_772_Open_Image onclick="this.style.display='none'; Codehighlighter1_497_772_Open_Text.style.display='none'; Codehighlighter1_497_772_Closed_Image.style.display='inline'; Codehighlighter1_497_772_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_497_772_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_497_772_Closed_Text.style.display='none'; Codehighlighter1_497_772_Open_Image.style.display='inline'; Codehighlighter1_497_772_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_497_772_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_497_772_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG id=Codehighlighter1_507_626_Open_Image onclick="this.style.display='none'; Codehighlighter1_507_626_Open_Text.style.display='none'; Codehighlighter1_507_626_Closed_Image.style.display='inline'; Codehighlighter1_507_626_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_507_626_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_507_626_Closed_Text.style.display='none'; Codehighlighter1_507_626_Open_Image.style.display='inline'; Codehighlighter1_507_626_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_507_626_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_507_626_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Create&nbsp;the&nbsp;SessionFactory</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessionFactory&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().buildSessionFactory();<BR><IMG id=Codehighlighter1_649_768_Open_Image onclick="this.style.display='none'; Codehighlighter1_649_768_Open_Text.style.display='none'; Codehighlighter1_649_768_Closed_Image.style.display='inline'; Codehighlighter1_649_768_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_649_768_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_649_768_Closed_Text.style.display='none'; Codehighlighter1_649_768_Open_Image.style.display='inline'; Codehighlighter1_649_768_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(Throwable&nbsp;ex)&nbsp;</SPAN><SPAN id=Codehighlighter1_649_768_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_649_768_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Initial&nbsp;SessionFactory&nbsp;creation&nbsp;failed.</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;ex);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">throw</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ExceptionInInitializerError(ex);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;final&nbsp;ThreadLocal&nbsp;session&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ThreadLocal();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_841_926_Open_Image onclick="this.style.display='none'; Codehighlighter1_841_926_Open_Text.style.display='none'; Codehighlighter1_841_926_Closed_Image.style.display='inline'; Codehighlighter1_841_926_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_841_926_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_841_926_Closed_Text.style.display='none'; Codehighlighter1_841_926_Open_Image.style.display='inline'; Codehighlighter1_841_926_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_841_926_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_841_926_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;*&nbsp;根据当前线程获取相应的Session<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;Session<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;HibernateException<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_995_1198_Open_Image onclick="this.style.display='none'; Codehighlighter1_995_1198_Open_Text.style.display='none'; Codehighlighter1_995_1198_Closed_Image.style.display='inline'; Codehighlighter1_995_1198_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_995_1198_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_995_1198_Closed_Text.style.display='none'; Codehighlighter1_995_1198_Open_Image.style.display='inline'; Codehighlighter1_995_1198_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;Session&nbsp;currentSession()&nbsp;throws&nbsp;HibernateException&nbsp;</SPAN><SPAN id=Codehighlighter1_995_1198_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_995_1198_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;s&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(Session)&nbsp;session.</SPAN><SPAN style="COLOR: #0000ff">get</SPAN><SPAN style="COLOR: #000000">();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Open&nbsp;a&nbsp;new&nbsp;Session,&nbsp;if&nbsp;this&nbsp;Thread&nbsp;has&nbsp;none&nbsp;yet</SPAN><SPAN style="COLOR: #008000"><BR><IMG id=Codehighlighter1_1112_1180_Open_Image onclick="this.style.display='none'; Codehighlighter1_1112_1180_Open_Text.style.display='none'; Codehighlighter1_1112_1180_Closed_Image.style.display='inline'; Codehighlighter1_1112_1180_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1112_1180_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1112_1180_Closed_Text.style.display='none'; Codehighlighter1_1112_1180_Open_Image.style.display='inline'; Codehighlighter1_1112_1180_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(s&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_1112_1180_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1112_1180_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;sessionFactory.openSession();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.</SPAN><SPAN style="COLOR: #0000ff">set</SPAN><SPAN style="COLOR: #000000">(s);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;s;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_1203_1264_Open_Image onclick="this.style.display='none'; Codehighlighter1_1203_1264_Open_Text.style.display='none'; Codehighlighter1_1203_1264_Closed_Image.style.display='inline'; Codehighlighter1_1203_1264_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1203_1264_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1203_1264_Closed_Text.style.display='none'; Codehighlighter1_1203_1264_Open_Image.style.display='inline'; Codehighlighter1_1203_1264_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1203_1264_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_1203_1264_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;*&nbsp;返回Session给相应的线程<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;HibernateException<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_1328_1432_Open_Image onclick="this.style.display='none'; Codehighlighter1_1328_1432_Open_Text.style.display='none'; Codehighlighter1_1328_1432_Closed_Image.style.display='inline'; Codehighlighter1_1328_1432_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1328_1432_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1328_1432_Closed_Text.style.display='none'; Codehighlighter1_1328_1432_Open_Image.style.display='inline'; Codehighlighter1_1328_1432_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;closeSession()&nbsp;throws&nbsp;HibernateException&nbsp;</SPAN><SPAN id=Codehighlighter1_1328_1432_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1328_1432_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;s&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(Session)&nbsp;session.</SPAN><SPAN style="COLOR: #0000ff">get</SPAN><SPAN style="COLOR: #000000">();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;session.</SPAN><SPAN style="COLOR: #0000ff">set</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(s&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;针对WEB程序，还可以利用Servlet2.3的Filter机制，轻松实现线程生命周期内的Session管理。下面是一个通过Filter进行Session管理的典型案例：<BR><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_49_666_Open_Image onclick="this.style.display='none'; Codehighlighter1_49_666_Open_Text.style.display='none'; Codehighlighter1_49_666_Closed_Image.style.display='inline'; Codehighlighter1_49_666_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_49_666_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_49_666_Closed_Text.style.display='none'; Codehighlighter1_49_666_Open_Image.style.display='inline'; Codehighlighter1_49_666_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;PersistenceFilter&nbsp;implements&nbsp;Filter&nbsp;</SPAN><SPAN id=Codehighlighter1_49_666_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_49_666_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">protected</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;ThreadLocal&nbsp;hibernateHolder&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ThreadLocal();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_249_655_Open_Image onclick="this.style.display='none'; Codehighlighter1_249_655_Open_Text.style.display='none'; Codehighlighter1_249_655_Closed_Image.style.display='inline'; Codehighlighter1_249_655_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_249_655_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_249_655_Closed_Text.style.display='none'; Codehighlighter1_249_655_Open_Image.style.display='inline'; Codehighlighter1_249_655_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;doFilter(ServletRequest&nbsp;request,&nbsp;ServletResponse&nbsp;response,&nbsp;FilterChain&nbsp;chain)&nbsp;throws&nbsp;IOException,&nbsp;ServletException&nbsp;</SPAN><SPAN id=Codehighlighter1_249_655_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_249_655_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;hibernateHolder.</SPAN><SPAN style="COLOR: #0000ff">set</SPAN><SPAN style="COLOR: #000000">(getSession());<BR><IMG id=Codehighlighter1_298_371_Open_Image onclick="this.style.display='none'; Codehighlighter1_298_371_Open_Text.style.display='none'; Codehighlighter1_298_371_Closed_Image.style.display='inline'; Codehighlighter1_298_371_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_298_371_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_298_371_Closed_Text.style.display='none'; Codehighlighter1_298_371_Open_Image.style.display='inline'; Codehighlighter1_298_371_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_298_371_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_298_371_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<IMG src="http://www.blogjava.net/images/dot.gif"><IMG src="http://www.blogjava.net/images/dot.gif"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chain.doFilter(request,&nbsp;response);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<IMG src="http://www.blogjava.net/images/dot.gif"><IMG src="http://www.blogjava.net/images/dot.gif"><BR><IMG id=Codehighlighter1_381_651_Open_Image onclick="this.style.display='none'; Codehighlighter1_381_651_Open_Text.style.display='none'; Codehighlighter1_381_651_Closed_Image.style.display='inline'; Codehighlighter1_381_651_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_381_651_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_381_651_Closed_Text.style.display='none'; Codehighlighter1_381_651_Open_Image.style.display='inline'; Codehighlighter1_381_651_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">finally</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_381_651_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_381_651_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(Session)&nbsp;hibernateHolder.</SPAN><SPAN style="COLOR: #0000ff">get</SPAN><SPAN style="COLOR: #000000">();<BR><IMG id=Codehighlighter1_467_645_Open_Image onclick="this.style.display='none'; Codehighlighter1_467_645_Open_Text.style.display='none'; Codehighlighter1_467_645_Closed_Image.style.display='inline'; Codehighlighter1_467_645_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_467_645_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_467_645_Closed_Text.style.display='none'; Codehighlighter1_467_645_Open_Image.style.display='inline'; Codehighlighter1_467_645_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(session&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_467_645_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_467_645_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hibernateHolder.</SPAN><SPAN style="COLOR: #0000ff">set</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">);<BR><IMG id=Codehighlighter1_516_553_Open_Image onclick="this.style.display='none'; Codehighlighter1_516_553_Open_Text.style.display='none'; Codehighlighter1_516_553_Closed_Image.style.display='inline'; Codehighlighter1_516_553_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_516_553_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_516_553_Closed_Text.style.display='none'; Codehighlighter1_516_553_Open_Image.style.display='inline'; Codehighlighter1_516_553_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_516_553_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_516_553_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close();<BR><IMG id=Codehighlighter1_585_637_Open_Image onclick="this.style.display='none'; Codehighlighter1_585_637_Open_Text.style.display='none'; Codehighlighter1_585_637_Closed_Image.style.display='inline'; Codehighlighter1_585_637_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_585_637_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_585_637_Closed_Text.style.display='none'; Codehighlighter1_585_637_Open_Image.style.display='inline'; Codehighlighter1_585_637_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(HibernateException&nbsp;ex)&nbsp;</SPAN><SPAN id=Codehighlighter1_585_637_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_585_637_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">throw</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ServletException(ex);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<IMG src="http://www.blogjava.net/images/dot.gif"><IMG src="http://www.blogjava.net/images/dot.gif"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV></DIV><img src ="http://www.blogjava.net/georgehill/aggbug/8759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/georgehill/" target="_blank">小米</a> 2005-07-29 19:43 <a href="http://www.blogjava.net/georgehill/archive/2005/07/29/8759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《深入浅出Hibernate》读书笔记(8)——Hibernate分页</title><link>http://www.blogjava.net/georgehill/archive/2005/07/26/8502.html</link><dc:creator>小米</dc:creator><author>小米</author><pubDate>Tue, 26 Jul 2005 10:12:00 GMT</pubDate><guid>http://www.blogjava.net/georgehill/archive/2005/07/26/8502.html</guid><wfw:comment>http://www.blogjava.net/georgehill/comments/8502.html</wfw:comment><comments>http://www.blogjava.net/georgehill/archive/2005/07/26/8502.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/georgehill/comments/commentRss/8502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/georgehill/services/trackbacks/8502.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据分页显示，是很多B/S系统会遇到的问题。现在大多数主流数据库都提供了数据部分读取机制，而对于某些没有提供相应机制的数据而言，Hibernate也通过其它途径实现了分页，如通过Scrollable ResultSet，如果JDBC不支持Scrollable ResultSet，Hibernate也会自动通过ResultSet的next方法进行记录定位。Hibernate的Criteria、Query等接口提供了一致的方法设定分页范围。下面是书中的例子：<BR><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">Criteria&nbsp;criteria&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;session.createCriteria(TUser.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>Criteria.add(Expression.eq(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">age</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">20</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">从检索结果中获取第100条记录开始的20条记录</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">criteria.setFirstResult(</SPAN><SPAN style="COLOR: #000000">100</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>criteria.setFetchSize(</SPAN><SPAN style="COLOR: #000000">20</SPAN><SPAN style="COLOR: #000000">);</SPAN></DIV></DIV><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不过，我在测试的时候总是不能够正常工作，把setFetchSize方法换成setMaxResults方法才行。换成最新的mysql-connector-java-3.1.10-bin-g.jar驱动也是一样。<img src ="http://www.blogjava.net/georgehill/aggbug/8502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/georgehill/" target="_blank">小米</a> 2005-07-26 18:12 <a href="http://www.blogjava.net/georgehill/archive/2005/07/26/8502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《深入浅出Hibernate》读书笔记(7)——回调与拦截机制</title><link>http://www.blogjava.net/georgehill/archive/2005/07/21/8145.html</link><dc:creator>小米</dc:creator><author>小米</author><pubDate>Thu, 21 Jul 2005 10:35:00 GMT</pubDate><guid>http://www.blogjava.net/georgehill/archive/2005/07/21/8145.html</guid><wfw:comment>http://www.blogjava.net/georgehill/comments/8145.html</wfw:comment><comments>http://www.blogjava.net/georgehill/archive/2005/07/21/8145.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/georgehill/comments/commentRss/8145.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/georgehill/services/trackbacks/8145.html</trackback:ping><description><![CDATA[<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate通过Lifecycle、Validatable接口制定了实体对象CRUD过程中的回调方式。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lifecycle接口中的onSave、onUpdate、onDelete方法，如果返回true则意味着需要中止执行相应的操作过程。如果代码运行期间抛出了CallbackException，对应的操作也会被中止。注意，不要试图在这些方法中调用Session进行持久化操作，这些方法中Session无法正常使用。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validatable.validate方法将在实体被持久化之前得到调用以对数据进行验证。此方法在实体对象的生命周期内可能被数次调用，因此，此方法仅用于数据本身的逻辑校验，而不要试图在此实现业务逻辑的验证。<BR>
<HR>
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate还引入了Interceptor，为持久化事件的捕获和处理提供了一个非侵略性的实现。Interceptor接口定义了Hibernate中的通用拦截机制。Session创建时即可指定加载相应的Interceptor，之后，此Session的持久化操作动作都将首先经由此拦截器捕获处理。简单的加载范例如下：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">SessionFactory&nbsp;factory&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;config.buildSessionFactory();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>Interceptor&nbsp;it&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;MyInterceptor();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>session&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;sessionFactory.openSession(it);</SPAN></DIV></DIV><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;需要注意的是，与Lifecycle相同，Interceptor的方法中不可通过Session实例进行持久化操作。<img src ="http://www.blogjava.net/georgehill/aggbug/8145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/georgehill/" target="_blank">小米</a> 2005-07-21 18:35 <a href="http://www.blogjava.net/georgehill/archive/2005/07/21/8145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SUN将于今年的9月13日和9月14日举办2005中国Java开发者大会</title><link>http://www.blogjava.net/georgehill/archive/2005/07/20/8044.html</link><dc:creator>小米</dc:creator><author>小米</author><pubDate>Wed, 20 Jul 2005 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/georgehill/archive/2005/07/20/8044.html</guid><wfw:comment>http://www.blogjava.net/georgehill/comments/8044.html</wfw:comment><comments>http://www.blogjava.net/georgehill/archive/2005/07/20/8044.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/georgehill/comments/commentRss/8044.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/georgehill/services/trackbacks/8044.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有兴趣的可以去参加看看，网址：<A href="http://www.javachina.cn/Index.jsp"  target="_blank">http://www.javachina.cn/Index.jsp</A><img src ="http://www.blogjava.net/georgehill/aggbug/8044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/georgehill/" target="_blank">小米</a> 2005-07-20 14:55 <a href="http://www.blogjava.net/georgehill/archive/2005/07/20/8044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《深入浅出Hibernate》读书笔记(6)——集合类型和结果集排序</title><link>http://www.blogjava.net/georgehill/archive/2005/07/20/8033.html</link><dc:creator>小米</dc:creator><author>小米</author><pubDate>Wed, 20 Jul 2005 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/georgehill/archive/2005/07/20/8033.html</guid><wfw:comment>http://www.blogjava.net/georgehill/comments/8033.html</wfw:comment><comments>http://www.blogjava.net/georgehill/archive/2005/07/20/8033.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/georgehill/comments/commentRss/8033.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/georgehill/services/trackbacks/8033.html</trackback:ping><description><![CDATA[<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最近真是忙，事情都挤到一块去了。<IMG height=20 src="http://www.blogjava.net/Emoticons/QQ/19.gif" width=20 border=0>&nbsp;终于有时间又看了几页书。<IMG height=20 src="http://www.blogjava.net/Emoticons/QQ/15.gif" width=20 border=0><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;言归正传，Hibernate中的Collection类型分为有序集和无序集两类。这里所谓的有序和无序，是针对Hibernate数据持久过程中，是否保持数据集合中的记录排列顺序加以区分的。无序集有Set，Bag，Map几种，有序集有List一种。有序集的数据在持久化过程中，会将集合中元素排列的先后顺序同时固化到数据库中，读取时也会返回一个具备同样排列顺序的数据集合。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate中的Collection类型是用的自己的实现，所以在程序中，不能够把接口强制转化成相应的JDK Collection的实现。<BR>
<HR>
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;结果集的排序有两种方式：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1. Sort<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection中的数据排序。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2. order-by<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对数据库执行Select SQL时，由order by子句实现的数据排序方式。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;需要注意的是，order-by特性在实现中借助了JDK 1.4中的新增集合类LinkedHashSet以及LinkedHashMap。因此，order-by特性只支持在1.4版本以上的JDK中运行。</P><img src ="http://www.blogjava.net/georgehill/aggbug/8033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/georgehill/" target="_blank">小米</a> 2005-07-20 10:56 <a href="http://www.blogjava.net/georgehill/archive/2005/07/20/8033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《深入浅出Hibernate》读书笔记(5)——持久层操作</title><link>http://www.blogjava.net/georgehill/archive/2005/07/12/7556.html</link><dc:creator>小米</dc:creator><author>小米</author><pubDate>Tue, 12 Jul 2005 10:49:00 GMT</pubDate><guid>http://www.blogjava.net/georgehill/archive/2005/07/12/7556.html</guid><wfw:comment>http://www.blogjava.net/georgehill/comments/7556.html</wfw:comment><comments>http://www.blogjava.net/georgehill/archive/2005/07/12/7556.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/georgehill/comments/commentRss/7556.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/georgehill/services/trackbacks/7556.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session.get/load的区别：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.如果未能发现符合条件的记录，get方法返回null，而load方法会抛出一个ObejctNotFoundException。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.Load方法可返回实体的代理类类型，而get方法永远直接返回实体类。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.Load方法可以充分利用内部缓存和二级缓存中现有数据，而get方法则仅仅在内部缓存中进行数据查找，如没有发现对应数据，将越过二级缓存，直接调用SQL完成数据读取。
<P></P>
<P>
<HR>
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session.find/iterate的区别：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;find方法将执行Select SQL从数据库中获得所有符合条件的记录并构造相应的实体对象，实体对象构建完毕之后，就将其纳入缓存。它对缓存只写不读，因此无法利用缓存。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterate方法首先执行一条Select SQL以获得所有符合查询条件的数据id，随即，iterate方法首先在本地缓存中根据id查找对应的实体对象是否存在，如果缓存中已经存在对应的数据，则直接以此数据对象作为查询结果，如果没有找到，再执行相应的Select语句获得对应的库表记录（iterate方法如果执行了数据库读取操作并构建了完整的数据对象，也会将其查询结果纳入缓存）。
<P></P>
<P>
<HR>
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query Cache产生作用的情况：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.完全相同的Select SQL重复执行。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.在两次查询之间，此Select SQL对应的库表没有发生过改变。
<P></P>
<P>
<HR>
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session.save方法的执行步骤：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.在Session内部缓存中寻找待保存对象。内部缓存命中，则认为此数据已经保存（执行过insert操作），实体对象已经处于Persistent状态，直接返回。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.如果实体类实现了lifecycle接口，则调用待保存对象的onSave方法。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.如果实体类实现了validatable接口，则调用其validate()方法。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.调用对应拦截器的Interceptor.onSave方法（如果有的话）。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.构造Insert SQL，并加以执行。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.记录插入成功，user.id属性被设定为insert操作返回的新记录id值。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7.将user对象放入内部缓存。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.最后，如果存在级联关系，对级联关系进行递归处理。
<P></P>
<P>
<HR>
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session.update方法的执行步骤：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.根据待更新实体对象的Key，在当前session的内部缓存中进行查找，如果发现，则认为当前实体对象已经处于Persistent状态，返回。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.初始化实体对象的状态信息（作为之后脏数据检查的依据），并将其纳入内部缓存。注意这里Session.update方法本身并没有发送Update SQL完成数据更新操作，Update SQL将在之后的Session.flush方法中执行（Transaction.commit在真正提交数据库事务之前会调用Session.flush）。
<P></P>
<P>
<HR>

<P></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session.saveOrUpdate方法的执行步骤：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.首先在Session内部缓存中进行查找，如果发现则直接返回。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.执行实体类对应的Interceptor.isUnsaved方法（如果有的话），判断对象是否为未保存状态。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.根据unsaved-value判断对象是否处于未保存状态。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.如果对象未保存（Transient状态），则调用save方法保存对象。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.如果对象为已保存（Detached状态），调用update方法将对象与Session重新关联。</P><img src ="http://www.blogjava.net/georgehill/aggbug/7556.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/georgehill/" target="_blank">小米</a> 2005-07-12 18:49 <a href="http://www.blogjava.net/georgehill/archive/2005/07/12/7556.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《深入浅出Hibernate》读书笔记(4)——事务管理</title><link>http://www.blogjava.net/georgehill/archive/2005/07/08/7374.html</link><dc:creator>小米</dc:creator><author>小米</author><pubDate>Fri, 08 Jul 2005 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/georgehill/archive/2005/07/08/7374.html</guid><wfw:comment>http://www.blogjava.net/georgehill/comments/7374.html</wfw:comment><comments>http://www.blogjava.net/georgehill/archive/2005/07/08/7374.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/georgehill/comments/commentRss/7374.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/georgehill/services/trackbacks/7374.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;事务的4个基本特性（ACID）：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1. Atomic（原子性）：事务中包含的操作被看作一个逻辑单元，这个逻辑单元中的操作要么全部成功，要么全部失败。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2. Consistency（一致性）：只有合法的数据可以被写入数据库，否则事务应该将其回滚到最初状态。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3. Isolation（隔离性）：事务允许多个用户对同一个数据的并发访问，而不破坏数据的正确性和完整性。同时，并行事务的修改必须与其他并行事务的修改相互独立。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4. Durability（持久性）：事务结束后，事务处理的结果必须能够得到固化。 
<HR>
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据库操作过程中可能出现的3种不确定情况：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1. 脏读取（Dirty Reads）：一个事务读取了另一个并行事务未提交的数据。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2. 不可重复读取（Non-repeatable Reads）：一个事务再次读取之前的数据时，得到的数据不一致，被另一个已提交的事务修改。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3. 虚读（Phantom Reads）：一个事务重新执行一个查询，返回的记录中包含了因为其他最近提交的事务而产生的新记录。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;标准SQL规范中，为了避免上面3种情况的出现，定义了4个事务隔离等级：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1. Read Uncommitted：最低等级的事务隔离，仅仅保证了读取过程中不会读取到非法数据。上诉3种不确定情况均有可能发生。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2. Read Committed：大多数主流数据库的默认事务等级，保证了一个事务不会读到另一个并行事务已修改但未提交的数据，避免了“脏读取”。该级别适用于大多数系统。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3. Repeatable Read：保证了一个事务不会修改已经由另一个事务读取但未提交（回滚）的数据。避免了“脏读取”和“不可重复读取”的情况，但是带来了更多的性能损失。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4. Serializable：最高等级的事务隔离，上面3种不确定情况都将被规避。这个级别将模拟事务的串行执行。 
<HR>
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate将事务管理委托给底层的JDBC或者JTA，默认是基于JDBC Transaction的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate支持“悲观锁（Pessimistic Locking）”和“乐观锁（Optimistic Locking）”。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;悲观锁对数据被外界修改持保守态度，因此，在整个数据处理过程中，将数据处于锁定状态。悲观锁的实现，往往依靠数据库提供的锁机制。Hibernate通过使用数据库的for update子句实现了悲观锁机制。Hibernate的加锁模式有：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1. LockMode.NONE：无锁机制<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2. LockMode.WRITE：Hibernate在Insert和Update记录的时候会自动获取<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3. LockMode.READ：Hibernate在读取记录的时候会自动获取<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4. LockMode.UPGRADE：利用数据库的for update子句加锁<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5. LockMode.UPGRADE_NOWAIT：Oracle的特定实现，利用Oracle的for update nowait子句实现加锁<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;乐观锁大多是基于数据版本（Version）记录机制实现。Hibernate在其数据访问引擎中内置了乐观锁实现，可以通过class描述符的optimistic-lock属性结合version描述符指定。optimistic-lock属性有如下可选取值：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1. none：无乐观锁<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2. version：通过版本机制实现乐观锁<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3. dirty：通过检查发生变动过的属性实现乐观锁<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4. all：通过检查所有属性实现乐观锁<img src ="http://www.blogjava.net/georgehill/aggbug/7374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/georgehill/" target="_blank">小米</a> 2005-07-08 16:19 <a href="http://www.blogjava.net/georgehill/archive/2005/07/08/7374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>