﻿<?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--随笔分类-hibernate</title><link>http://www.blogjava.net/leekiang/category/22103.html</link><description>MDA/MDD/TDD/DDD/DDDDDDD</description><language>zh-cn</language><lastBuildDate>Fri, 04 Mar 2011 21:00:57 GMT</lastBuildDate><pubDate>Fri, 04 Mar 2011 21:00:57 GMT</pubDate><ttl>60</ttl><item><title>ibatis</title><link>http://www.blogjava.net/leekiang/archive/2011/02/26/345260.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sat, 26 Feb 2011 14:47:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2011/02/26/345260.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/345260.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2011/02/26/345260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/345260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/345260.html</trackback:ping><description><![CDATA[IBatis 怎样直接执行SQL语句：<br />&lt;sqlMap namespace="bbs_define"&gt;<br />    &lt;!– selectBySql –&gt;<br />    &lt;select id="selectBySql" resultClass="java.util.HashMap"<br />        remapResults="true"<br />        parameterClass="java.util.HashMap"&gt;<br />        &lt;isNotEmpty property="sql"&gt;$sql$&lt;/isNotEmpty&gt;<br />    &lt;/select&gt;   <br />    &lt;!– updateBySql –&gt;<br />    &lt;update id="updateBySql" parameterClass="java.util.HashMap"&gt;<br />        &lt;isNotEmpty property="sql"&gt;$sql$&lt;/isNotEmpty&gt;<br />    &lt;/update&gt;   <br />&lt;/sqlMap&gt;<br /><br />其中最重要的设置是“remapResults="true"”。remapResults设置成true，表示结果字段可以是不定的。也就是说，这次可返回“ID,NAME”两个字段，下次何返回“ID,NAME,TYPE_ID”三个字段，也可以返回“*”<br /><br />用ibatis实现数据水平切分：<br />http://code.google.com/p/shardbatis/<br />http://code.google.com/p/ibatis-sharding/<br /><br />参考：<br />1，Ibatis的动态SQL http://hz.seraph.blog.163.com/blog/static/981677452008111902458957/<br />2，使用ibatis的一点小技巧 http://qa.taobao.com/?p=7371<br />3，http://www.ibm.com/developerworks/cn/opensource/os-cn-ibatis/?ca=drs-tp4608<br />4，http://itnewsvendor.appspot.com/2303004-ibatis_%E6%95%B4%E7%90%86_batis.html<br />5，http://itnewsvendor.appspot.com/4633016-ibatis_2.x_%E6%97%A5%E5%BF%97.html<br />6，http://blog.sina.com.cn/s/blog_63f93f510100i16h.html<br />7，http://lijingyao8206.javaeye.com/blog/840204<br />8, http://qa.taobao.com/?p=7677<br />9，http://blog.csdn.net/sunyujia/archive/2008/07/13/2646030.aspx<br />10，iBATIS不适合使用的四种情况浅析 http://developer.51cto.com/art/200907/136897.htm<br />11，http://blog.sina.com.cn/s/blog_63f93f510100i16h.html<br /><img src ="http://www.blogjava.net/leekiang/aggbug/345260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2011-02-26 22:47 <a href="http://www.blogjava.net/leekiang/archive/2011/02/26/345260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于ORM</title><link>http://www.blogjava.net/leekiang/archive/2010/02/14/313005.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sun, 14 Feb 2010 13:22:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/02/14/313005.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/313005.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/02/14/313005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/313005.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/313005.html</trackback:ping><description><![CDATA[1,ORM已经过时了http://www.javaeye.com/articles/2266<br />  http://codemonkeyism.com/orms/<br />2，http://corte.si/posts/code/farewell-to-orms.html<br />3,http://andyhu1007.javaeye.com/blog/636063<br />http://blog.csdn.net/chelsea/archive/2009/12/28/5094652.aspx<br /><img src ="http://www.blogjava.net/leekiang/aggbug/313005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-02-14 21:22 <a href="http://www.blogjava.net/leekiang/archive/2010/02/14/313005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate动态表</title><link>http://www.blogjava.net/leekiang/archive/2010/01/03/308095.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sun, 03 Jan 2010 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/01/03/308095.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/308095.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/01/03/308095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/308095.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/308095.html</trackback:ping><description><![CDATA[1，<br /><a target="_blank" href="/sparkyang/archive/2005/09/12/12782.html">Hibernate动态模型(dynamic models) 一对多映射的实现</a><br />http://scnjl.blogbus.com/logs/35361929.html<br /><br />2，<br />hibernate shards<br /><br />3,<br />http://www.javaeye.com/topic/142404<br /><br />4,<br />http://www.infoq.com/cn/articles/hibernate-custom-fields<br /><img src ="http://www.blogjava.net/leekiang/aggbug/308095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-01-03 17:31 <a href="http://www.blogjava.net/leekiang/archive/2010/01/03/308095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在一个单独的DAO中混合使用Hibernate 和 JDBC </title><link>http://www.blogjava.net/leekiang/archive/2009/12/18/306589.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Fri, 18 Dec 2009 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2009/12/18/306589.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/306589.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2009/12/18/306589.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/306589.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/306589.html</trackback:ping><description><![CDATA[
		<p class="11" style="margin: 0cm 0cm 0pt; text-indent: 19pt;">
				<font size="2">
						<span lang="EN-US">
								<font face="Times New Roman">Hibernate </font>
						</span>
						<span style="font-family: 宋体;">的确通过</span>
						<span style="font-family: TheSansMonoConSemiLight;" lang="EN-US">
								<font face="Times New Roman">PersistentEnum</font>
						</span>
						<span style="font-family: 宋体;">接口提供了对标准化</span>
						<font face="Times New Roman">
						</font>
						<span style="font-family: 宋体;">的支持，这使得我们的域对象实现了一个与</span>
						<span lang="EN-US">
								<font face="Times New Roman">ShippingCompany</font>
						</span>
						<span style="font-family: 宋体;">对象非常类似的结构。然而，我们可能对将域对象与某个特定的持久化实现过于耦合持保守态度。如果我们计划长期使用</span>
						<span lang="EN-US">
								<font face="Times New Roman">Hibernate</font>
						</span>
						<span style="font-family: 宋体;">，这可能并不是一个太大的问题，但是请谨慎考虑这个决策。如果我们使用</span>
						<span lang="EN-US">
								<font face="Times New Roman">ibatis</font>
						</span>
						<span style="font-family: 宋体;">，那么我们就完全没那么幸运了；它完全不支持标准化。谢天谢地，如果我们的</span>
						<span lang="EN-US">
								<font face="Times New Roman">ORM</font>
						</span>
						<span style="font-family: 宋体;">导致过耦合或者完全没有这方面的支持，还有个解决方案——使用</span>
						<span lang="EN-US">
								<font face="Times New Roman">JDBC</font>
						</span>
						<span style="font-family: 宋体;">。</span>
				</font>
		</p>
		<p class="11" style="margin: 0cm 0cm 0pt; text-indent: 19pt;">
				<font size="2">
						<span style="font-family: 宋体;">有</span>
						<span lang="EN-US">
								<font face="Times New Roman">Spring</font>
						</span>
						<span style="font-family: 宋体;">的支持，使用</span>
						<span lang="EN-US">
								<font face="Times New Roman">JDBC</font>
						</span>
						<span style="font-family: 宋体;">变得如此简单，我们不会再因为它的复杂性而将其的优先级打个折扣。可是，如果我们选择使用某个特定的</span>
						<span lang="EN-US">
								<font face="Times New Roman">ORM</font>
						</span>
						<span style="font-family: 宋体;">工具，那么我们就很难用基于</span>
						<span lang="EN-US">
								<font face="Times New Roman">JDBC</font>
						</span>
						<span style="font-family: 宋体;">的</span>
						<span lang="EN-US">
								<font face="Times New Roman">DAO</font>
						</span>
						<span style="font-family: 宋体;">实现进行替换了——目前我们就是这样。当我们同时在一个类中包含了</span>
						<span lang="EN-US">
								<font face="Times New Roman">JDBC</font>
						</span>
						<span style="font-family: 宋体;">和</span>
						<span lang="EN-US">
								<font face="Times New Roman">hibernate</font>
						</span>
						<span style="font-family: 宋体;">代码时，我们就无法使用</span>
						<span lang="EN-US">
								<font face="Times New Roman">Spring</font>
						</span>
						<span style="font-family: 宋体;">提供的支持。因为我们的</span>
						<span lang="EN-US">
								<font face="Times New Roman">DAO</font>
						</span>
						<span style="font-family: 宋体;">只能扩展</span>
						<span style="font-family: TheSansMonoConSemiLight;" lang="EN-US">
								<font face="Times New Roman">HibernateDaoSupport </font>
						</span>
						<span style="font-family: 宋体;">或</span>
						<font face="Times New Roman">
								<span style="font-family: TheSansMonoConSemiLight;" lang="EN-US">JdbcDaoSupport</span>
						</font>
						<span style="font-family: 宋体;">二者之一。幸运的是，这里有一个优雅的解决方案，它允许我们将</span>
						<span lang="EN-US">
								<font face="Times New Roman">Hibernate</font>
						</span>
						<span style="font-family: 宋体;">和</span>
						<span lang="EN-US">
								<font face="Times New Roman">JDBC</font>
						</span>
						<span style="font-family: 宋体;">代码封装在同一个类之内，而不会因此失去</span>
						<span lang="EN-US">
								<font face="Times New Roman">Spring</font>
						</span>
						<span style="font-family: 宋体;">的支持。这个方案的关键在于将</span>
						<span lang="EN-US">
								<font face="Times New Roman">JDBC</font>
						</span>
						<span style="font-family: 宋体;">代码封装在内部类中，之后将主体</span>
						<span lang="EN-US">
								<font face="Times New Roman">DAO</font>
						</span>
						<span style="font-family: 宋体;">的调用委托给这个内部类去完成。代码清单</span>
						<span lang="EN-US">
								<font face="Times New Roman"> 11-6</font>
						</span>
						<span style="font-family: 宋体;">提供了一个示例：</span>
				</font>
		</p>
		<p class="10" style="margin: 8pt 0cm 6pt;">
				<b>
						<span style="font-family: 黑体;">代码清单</span>
				</b>
				<b>
						<span style="font-family: HelveticaNeue-BoldCond;" lang="EN-US"> 11-16. </span>
				</b>
				<span style="font-family: 黑体;">在一个单独的</span>
				<span lang="EN-US">DAO</span>
				<span style="font-family: 黑体;">中混合使用</span>
				<span lang="EN-US">Hibernate </span>
				<span style="font-family: 黑体;">和</span>
				<span lang="EN-US"> JDBC </span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">package com.apress.prospring.ch11.canonicalization;</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New"> </font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">import org.springframework.jdbc.core.support.JdbcDaoSupport;</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">import org.springframework.orm.hibernate.support.HibernateDaoSupport;</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New"> </font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">public class MyDao extends HibernateDaoSupport {</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New"> </font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">   private MyJdbcDao innerDao;</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New"> </font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">   public MyDao() {</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">      innerDao = new MyJdbcDao();</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">   }</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New"> </font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">   public void update(MyDomainObject obj) {</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">      // use Hibernate to persist the data</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">   }</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New"> </font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">   public MyDomainObject getById(int someId) {</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">      return innerDao.getBy(someId);</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">   }</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New"> </font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">   private static class MyJdbcDao extends JdbcDaoSupport {</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New"> </font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">      public MyDomainObject getBy(int someId) {</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">         // do some real processing</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">         return null;</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">      }</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">   }</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New">}</font>
				</span>
		</p>
		<p class="2" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<font size="2" face="Courier New"> </font>
				</span>
		</p>
		<p class="11" style="margin: 0cm 0cm 0pt; text-indent: 19pt;">
				<font size="2">
						<span style="font-family: 宋体;">尽管这只是一个简单的实现，我们也可以从中得到启发。所有的</span>
						<span lang="EN-US">
								<font face="Times New Roman">JDBC</font>
						</span>
						<span style="font-family: 宋体;">相关代码都被转移到一个内部类中，而此内部类扩展了</span>
						<font face="Times New Roman">
								<span style="font-family: TheSansMonoConSemiLight;" lang="EN-US">JdbcDaoSupport</span>
								<span lang="EN-US">,</span>
						</font>
						<span style="font-family: 宋体;">所有的</span>
						<span lang="EN-US">
								<font face="Times New Roman">Hibernate</font>
						</span>
						<span style="font-family: 宋体;">相关功能都留在外部，外部类仍然是</span>
						<font face="Times New Roman">
								<span style="font-family: TheSansMonoConSemiLight;" lang="EN-US">HibernateDaoSupport</span>
								<span lang="EN-US">.</span>
						</font>
						<span style="font-family: 宋体;">的子类。通过这个类，我们可以使用</span>
						<span lang="EN-US">
								<font face="Times New Roman">Hibernate</font>
						</span>
						<span style="font-family: 宋体;">完成域对象的持久化，但是我们可以将查询功能交给嵌入的</span>
						<span lang="EN-US">
								<font face="Times New Roman">JDBC DAO</font>
						</span>
						<span style="font-family: 宋体;">去完成。</span>
				</font>
		</p>
		<p class="11" style="margin: 0cm 0cm 0pt; text-indent: 19pt;">
				<font size="2">
						<span style="font-family: 宋体;">在我们的应用中有效利用标准化</span>
						<font face="Times New Roman">
						</font>
						<span style="font-family: 宋体;">，可以通过避免大量无谓对象的创建，从而极大提升内存使用效率。如果我们必须更新标准化对象相关的数据，同时我们在</span>
						<span lang="EN-US">
								<font face="Times New Roman">DAO</font>
						</span>
						<span style="font-family: 宋体;">中使用了</span>
						<span lang="EN-US">
								<font face="Times New Roman">ORM</font>
						</span>
						<span style="font-family: 宋体;">框架，那么我们就可以以</span>
						<span lang="EN-US">
								<font face="Times New Roman">ORM</font>
						</span>
						<span style="font-family: 宋体;">无关的形式引入一些</span>
						<span lang="EN-US">
								<font face="Times New Roman">JDBC</font>
						</span>
						<span style="font-family: 宋体;">代码来加入标准化</span>
						<font face="Times New Roman">
						</font>
						<span style="font-family: 宋体;">支持。</span>
				</font>
		</p>
		<p class="11" style="margin: 0cm 0cm 0pt; text-indent: 19pt;">
				<br />
				<font size="2">
						<span style="font-family: 宋体;">
						</span>
				</font>
		</p>
		<p class="11" style="margin: 0cm 0cm 0pt; text-indent: 19pt;">
				<font size="2">
						<span style="font-family: 宋体;">来源:Pro Spring中文版 http://book.csdn.net/bookfiles/48/100481407.shtml</span>
				</font>
		</p>
		<p class="11" style="margin: 0cm 0cm 0pt; text-indent: 19pt;">
				<font size="2">
						<span style="font-family: 宋体;">http://hi.baidu.com/%D3%F4%C3%C6%BB%A8%C9%FA%BD%B4/blog/item/7768d41e8c06ceffe0fe0ba6.html<br /></span>
				</font>
		</p>
<img src ="http://www.blogjava.net/leekiang/aggbug/306589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2009-12-18 16:51 <a href="http://www.blogjava.net/leekiang/archive/2009/12/18/306589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate和jdbc事务统一控制</title><link>http://www.blogjava.net/leekiang/archive/2009/12/11/305492.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Thu, 10 Dec 2009 16:14:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2009/12/11/305492.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/305492.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2009/12/11/305492.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/305492.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/305492.html</trackback:ping><description><![CDATA[“Hibernate与JDBC(iBATIS)  都使用 DataSourceTransactionManager 同样可以保证事务<br />
原理就是保证了 connection 的唯一性。<br />
jdbc我是调spring的jdbcTemplate来操作，<br />
经过测试。在同一个数据源的情况下直接使用Hibernate的TxManager可以同步事务，问题解决。<br />
”<br />
Rod Johnson的话： <br />
引用<br />
It is possible--and sometimes useful--to have coordinated transactions
for both. Your JDBC transactions will be managed by the
HibernateTransactionManager if you work with the same JDBC DataSource
in the same transaction. That is, create the SessionFactory using
Spring's SessionFactoryBean using the same DataSource that your
JdbcTemplates use. <br /><br />
The only issue to watch, of course, is that you may be invalidating
your Hibernate cache by JDBC changes. Generally I find it best to use
JDBC to update only tables that don't have Hibernate mappings. <br /><br />
Juergen Hoeller的话： <br />
引用<br />
As Rod said, simply keep using HibernateTransactionManager, which
auto-detects the DataSource used by Hibernate and seamlessly exposes
Hibernate transactions as JDBC transactions for that DataSource. JDBC
code that accesses the same DataSource via Spring will automatically
participate in such transactions. <br /><br />
Note that you must specify the DataSource for Hibernate via
LocalSessionFactoryBean's "dataSource" property to allow
HibernateTransactionManager to auto-detect it. Alternatively, you can
explicitly pass the DataSource to HibernateTransactionManager's
"dataSource" property.<br />http://www.fireflow.org/redirect.php?tid=498<br /><br />Rod Johnson在spring 论坛中有一句话很好的总结了如何在测试中处理hibernate缓存: <br />Remember that you can clear the Hibernate session, removing objects already associated with it. This is often necessary before requerying in tests, and solves most (if not all) problems.<br />I typically use JDBC for verification. The pattern is<br />- do Hibernate operation<br />- flush Hibernate session<br />- issue JDBC query to verify results<br />That way I'm verifying what Hibernate did to the database in the same transaction.<br /><img src ="http://www.blogjava.net/leekiang/aggbug/305492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2009-12-11 00:14 <a href="http://www.blogjava.net/leekiang/archive/2009/12/11/305492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate处理LOB</title><link>http://www.blogjava.net/leekiang/archive/2009/07/31/289192.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Thu, 30 Jul 2009 16:05:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2009/07/31/289192.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/289192.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2009/07/31/289192.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/289192.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/289192.html</trackback:ping><description><![CDATA[1,摘自http://www.javaeye.com/topic/13335<br />Oracle9iR2和Oracle10G以上版本已经可以直接进行clob的插入，条件查询，模糊查询了。这一点，你可以试一试，我这周周一刚刚在
Oracle10.1.0.3 Linux x86上面试过，不管是where还是like，就像varchar2一样处理。
<br />另外将Oracle JDBC Driver升级到最新的版本，即Oracle10.1.0版本同时发布的odjbc14.jar，那么你将直接可以对clob进行操作。<br />也就是说，如果你使用最新的Oracle JDBC Driver，使用比较新的Oracle版本，你就可以直接像操作varchar2那样操作clob，没有任何限制了。
    <br />4000字符的限制完全是因为Oracle的Thin Driver造成的，用OCI Driver是不会有这个问题的。也就是说，这个限制与驱动相关与数据库无关。
<br />我试过使用10g的驱动跑9i的数据库，操作CLOB字段就和操作varchar2一样，并且没有4000的限制。一换成9i的Driver就错误依旧。。。8i的没有测试过，不过原理应该一样。
    <br />像Robbin说的那样，我用的是最新的最新的Oracle Database 10g (10.1.0.2.0) 驱动程序,数据库是Release
9.2.0.1.0 ,插入一条10万多字符的数据到clob类型的字段,抛出异常:Caused by:
java.sql.SQLException: setString 只能处理少于 32766 个字符的字符串。我试了多次，还是无法解决。<br />Robbin说的没错，我试过了在xxx.hbm.xml中将数据库中Clob类型的字段映射成Hibernate的<span style="color: red;"><span style="font-size: 9pt;">text</span></span>类型，没有任何限制，但是映射成java.lang.String类型却有32K大小的限制。
    <br />oracle 10g 的驱动的确好<br />thin driver 也能顺利按照 String 方式处理 Clob 字段，可以适用于 8.16 以后的所有版本<br />映射成text在同一列中有多个clob字段的时候有bug，
<br />保存时会将后一个字段的内容保存到前一个字段里面去，不知道什么原因，我实在有些莫名其妙。
<br />换成spring的ClobStringType后一切正常
    <br />经测试，使用 Oracle 10g 的 JDBC 驱动，可以把 LONG 类型的字段当成超长的 VARCHAR2 类型字段看待。
<br />注意：数据库中应该使用 LONG 型，而不是 CLOB 类型。使用 CLOB 类型，如果有中文，会莫名其妙的丢掉一些字符。这应该是 Oracle 的一个 bug。
<br />适用于 Oracle 9.2 以上版本的数据库。（注意仅仅是使用 10g 的 JDBC 驱动而已，即 ojdbc14.jar 包）
<br /><br />参考：
<br />* Oracle JDBC 驱动下载地址 http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html
<br />* Handling CLOBs - Made easy with Oracle JDBC 10g
http://www.oracle.com/technology/sample_code/tech/java/codesnippet/jdbc/clob10g/handlingclobsinoraclejdbc10g.html

<br /><img src ="http://www.blogjava.net/leekiang/aggbug/289192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2009-07-31 00:05 <a href="http://www.blogjava.net/leekiang/archive/2009/07/31/289192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HibernateException: Unexpected row count: 0 expected: 1</title><link>http://www.blogjava.net/leekiang/archive/2009/07/22/287818.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 22 Jul 2009 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2009/07/22/287818.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/287818.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2009/07/22/287818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/287818.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/287818.html</trackback:ping><description><![CDATA[[org.hibernate.event.def.AbstractFlushingEventListener] - Could not synchronize database state with session<br />org.hibernate.HibernateException: Unexpected row count: 0 expected: 1<br />    at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:32)<br /><br />    先用对象操作得到Person p = get(Person.class,35);<br />    直连得到connection,执行delete person where id=35<br />    <br />    事务提交前hibernate会对对象进行检查，看属性是否有变化，如果有变化就会执行update操作。<br />    事务方法内既有对象操作，又有sql时，往往sql先执行，<br />    id=35的记录已经被删了，再执行update 35时就会报那个臭名昭著的HibernateException: Unexpected row count: 0 expected: 1，不能同步数据库状态<br />    为什么有的记录删除时会update，有的却没有？开始一直没找到原因，因为update语句太长了，<br />    后来灵机一动，在映射里加了dynamic-update="true"，update语句变成了可爱的update Person set zd=? where ID=?<br />    一查AbstractPerson,发现getZd()被修改了：<br />        public String getZd() {<br />        if (zd != null)<br />            return zd;<br />        else<br />            return "";<br />       }<br />    这样凡是zd为null的记录，删除时都会报错。<br />    <br />    总结：(1)HQL和sql共用时要小心，一不小心就出现数据不同步，有空看看事务的处理<br />          (2)映射的类里的get方法不要随便修改<img src ="http://www.blogjava.net/leekiang/aggbug/287818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2009-07-22 11:13 <a href="http://www.blogjava.net/leekiang/archive/2009/07/22/287818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate异常"Found shared references to a collection"</title><link>http://www.blogjava.net/leekiang/archive/2008/10/31/237908.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Fri, 31 Oct 2008 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2008/10/31/237908.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/237908.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2008/10/31/237908.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/237908.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/237908.html</trackback:ping><description><![CDATA[问题:<br />假定,Parent类有一个Set属性，里面放的是Son。如果查询"from Parent",某个Parent哪怕一个Son都没有，那个Set属性不会为null，而是一个空集合。<br />这时候如果你Parent newP=new Parent();然后BeanUtils.copyPropertis(newP,origP);最后就会报hibernate异常"Found shared references to a collection"。<br />注:hibernate在什么时机发现"两个对象共享一个集合"的情况的？我这边的例子是在下一次查询时发现的。<br /><br />原因:<br />BeanUtils.copyPropertis是浅拷贝，导致这两个对象引用的Set是同一个Set,这在hibernate中是不允许的，参见Hibernate reference第6章的"Two entities may not share a reference to the same collection 
            instance"。<br />这种问题常见于复制对象时。<br />如何解决:newP.setSonSet(null);<br />还有人说原因可能是并发操作:http://www.blogjava.net/fastzch/archive/2006/12/22/89520.html<br /><br />参考:<br />http://markmail.org/message/fszouomkeicjynw2<br />http://blog.csdn.net/programeyonger/archive/2008/01/31/2075304.aspx<br />http://www.javaeye.com/topic/99505<br /><img src ="http://www.blogjava.net/leekiang/aggbug/237908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2008-10-31 22:11 <a href="http://www.blogjava.net/leekiang/archive/2008/10/31/237908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Session,SessionFactory,Connetion等</title><link>http://www.blogjava.net/leekiang/archive/2008/03/11/185503.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Tue, 11 Mar 2008 14:43:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2008/03/11/185503.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/185503.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2008/03/11/185503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/185503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/185503.html</trackback:ping><description><![CDATA[1,有时连续调多个Dao方法时会报连接关闭，原因往往是关闭session不当。<br />  不要用session.close(),这样会使同一个线程的下一个Dao方法里执行<br />  HibernateSessionFactory.getSession()时取到的是已经被关闭的session,当然会报错了。<br /><br />2，Connection conn =session.connection();<br />  这个conn一定要执行conn.close()吗?<br /><br />3,<br />http://hi.baidu.com/sodarfish/blog/item/b996a3df9224d217622798ec.html<br />在通常的情况下使用DriverManager.getConnection()得到的是一个Connection的实例，当你调用它的close（）方
法时会关闭StateMent和ResultSet。但是我们在使用连接池的过程中，通过连接池得到Connection，当我们调用
Connection的close（）时，Connection并不是被关闭了，而是回到了连接池中，它以后还会被其他的代码取出来使用，如果我们没有关
闭stmt和rs的话，只会使系统中的stmt和rs越来越多。所以在使用连接池后，调用conn.close（）前应先将rs和stmt关闭。<br /><br />
至于为什么调用close()之后不是直接关闭此连接，而是返回给<span class="hilite1">连接池</span>，这是因为dbcp使用委派模型来实现Connection接口了。 <br /><br />http://nymph.blogdriver.com/nymph/180989.html#comment<br />
http://www.javaeye.com/topic/9317?page=1<br />
http://www.javaeye.com/topic/48048?page=1<br /><a target="_blank" href="/wangdei1/archive/2008/10/05/232515.html">Hibernate中的session 事务处理机制</a><br />  <br /><img src ="http://www.blogjava.net/leekiang/aggbug/185503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2008-03-11 22:43 <a href="http://www.blogjava.net/leekiang/archive/2008/03/11/185503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate杂记</title><link>http://www.blogjava.net/leekiang/archive/2008/02/16/180148.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Fri, 15 Feb 2008 21:04:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2008/02/16/180148.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/180148.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2008/02/16/180148.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/180148.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/180148.html</trackback:ping><description><![CDATA[1，hibernate在进行复杂查询的情况下一样可以直接得到一个Map的list: <br />select new Map(a.id as id,a.name as name,b.type as type) from A a,B b where <br />a.id=b.aId; <br />... <br />List mapList=query.list(); <br />.... <br /><br />在jsp页面可以和使用普通的JavaBean一样的方式输出 <br />&lt;c:forEach items="${mapList}" var="m"&gt; <br />&lt;tr&gt; &lt;td&gt; <br />&lt;c:out value="${m.id}"/&gt; &lt;/td&gt; &lt;td&gt; <br />&lt;c:out value="${m.name}"/&gt; &lt;/td&gt; <br />&lt;td&gt; &lt;c:out value="${m.type}"/&gt; &lt;/td&gt; &lt;/tr&gt; <br />&lt;/c:forEach&gt; <br />这样的处理也是很简洁的 <br /><br />select new MyObj(id,name,deptid,deptName) from tb_usr,tb_dept where .....<br />这种方式要求MyObj类有对应的构造方法<br /><br />2.HQL supports subqueries in the where clause. We can’t think of many good uses <br />for subqueries in the from clause, although select clause subqueries might be a <br />nice future extension.<br />不支持from后的子查询，支持where子查询<br />http://blog.zol.com.cn/655/article_654256.html<br /><br />3， String sql="select {fi.*} from FuncInfo fi " +<br />   "left join RoleSubFunc rsf on fi.FuncId=rsf.FuncId "+ <br />       "left join RoleInfo ri on rsf.RoleId=ri.RoleId "+ <br />       "left join UserRole ur on ri.RoleId=ur.RoleId "+ <br />       "where ur.UserId='"+userId+"'";//可以无限向上找父级<br /> List list =session.createSQLQuery(sql).addEntity("fi", FuncInfo.class).list();<br /><br />4,<font face="Times New Roman">为什么Hibernate 3中的HQL无法查询汉字<br />使用同样的代码和配置文件，在Hibernate 2上完全没有问题，在Hibernate 3中，使用如下HQL查询，无法得到正确的结果集：<br />String hql = "from story where title like '%汉字%'"; <br />Query q = session.createQuery(hql); <br />但用下面的HQL查询，却可以得到正确结果集：<br />String hql = " from story where title like '%english%'"; <br />Query q = session.createQuery(hql); <br />答：如果采用的是拼接HQL的方式，从Hibernate 2升级到Hibernate 3确实会出现汉字乱码问题。在控制台中可以看到，SQL的汉字部分变成了乱码：<br />[DEBUG] 2005-08-14 14:33:58 org.hibernate.SQL - "select story0_.content from story as story0_ where story0_.title like '%&amp;–°é—&amp;&amp;Š¨&amp;€' <br />在Hibernate中，查询时应尽量使用占位符的写法（如下），这样既可以避免乱码问题，又可以避免潜在的SQL注入攻击：<br />getHibernate().find("from story where title like ? ", "%汉字%")<br />注:<font color="#ff0000">用"update TbTest set name='张三' "也会有类似的问题,要改为占位符的写法<br /><a target="_blank" href="http://xqfy1983.blog.sohu.com/61054398.html">http://xqfy1983.blog.sohu.com/61054398.html</a><br /></font><br />5,使用Hibernate.DATE时，得到的时间不带分秒。<br />  可以考虑使用Hibernate.CALENDAR,实际类型是java.util.GregorianCalendar,然后再getTime()<br />6,</font>报表查询  select new Table(t1.a,t2.b ...)  from .....<br />  select new Object(vo.id,vo.name) from VO vo<br />  这种写法需事先写好构造方法<br /><font face="Times New Roman">7,</font>List cats = sess.createSQLQuery("select {cat.*} from cats cat") <br />        .addEntity("cat", Cat.class); <br />        .setMaxResults(50); <br />        .list();<br />8,貌似hibernate添加或修改对象,如果字符串类型的属性的值为空字符串(大小为0),则自动当null处理<br />9,如果在hbm中某属性设为not null，然后如果po中的该属性为null，则hibernate会抛异常<br />  但如果在hbm中设置属性的长度，而实际的长度超过了，hibernate不会抛异常<br />10,如果要使生成得sql不是每次都包括所有的列，可配置参数实现:<br /><pre>&lt;class name="onlyfun.caterpillar.User" table="T_USER"<br /><span style="font-weight: bold;">           dynamic-insert="true"</span><br style="font-weight: bold;" /><span style="font-weight: bold;">           dynamic-update="true"</span>&gt; <br /> 来源:http://caterpillar.onlyfun.net/Gossip/HibernateGossip/DynamicSQL.html<br />   但并不是设置了dynamic-update=true就会有效果，要生效是有条件的.<br />   (1)同一session内，对已经persisit的对象进行update。<br />      但有一奇怪现象,例如memo字段原来为空，o.setMemo(null)，生成的update的sql还是会有set memo=null的语句,不知道为什么<br />   (2)不同session之间，update传入的对象是另一个session中的persist对象，然后merge<br />     http://qbar.qq.com/u2011541/19.htm<br />     http://xuliangyong.javaeye.com/blog/74696<br />11,<br /></pre><font face="Times New Roman"><a href="http://yuonch.javaeye.com/blog/89859">http://yuonch.javaeye.com/blog/89859</a><br /><a href="http://yuonch.javaeye.com/blog/90727">http://yuonch.javaeye.com/blog/90727</a><br /><br />12,<br /><span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry"><p style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">session.createQuery(</span><span style="font-size: 10pt; color: rgb(42, 0, 255); font-family: 'Courier New';" lang="EN-US">"delete from Company where id=1"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">).executeUpdate();</span><br />这种写法必须配置<span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry"><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US"><span></span>org.hibernate.hql.ast.ASTQueryTranslatorFactory,否则会报<br /></span></span></p></span><span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry"><font size="3"><span lang="EN-US"><font face="Times New Roman">HibernateQueryException: query must begin with SELECT or FROM<br /></font></span></font></span>见<a href="http://czg185960.spaces.live.com/blog/cns%2132A09070624FB42C%21208.entry">http://czg185960.spaces.live.com/blog/cns!32A09070624FB42C!208.entry</a></font><img src ="http://www.blogjava.net/leekiang/aggbug/180148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2008-02-16 05:04 <a href="http://www.blogjava.net/leekiang/archive/2008/02/16/180148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>升级到hibernate3.2</title><link>http://www.blogjava.net/leekiang/archive/2007/10/09/151197.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Mon, 08 Oct 2007 18:03:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2007/10/09/151197.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/151197.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2007/10/09/151197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/151197.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/151197.html</trackback:ping><description><![CDATA[
		<p>1,从Hibernate 3.0.x/3.1.x升级到最新的3.2版，一定要注意，3.2版的很多sql函数如count(), sum()的唯一返回值已经从Integer变为Long，如果不升级代码，会得到一个ClassCastException。</p>
		<p>这个变化主要是为了兼容JPA，可以在hibernate.org的最新文档中找到说明。</p>
		<p>Hibernate Team也提供了一个与原来兼容的解决方案：</p>
		<p>  Configuration classicCfg = new Configuration(); <br />  classicCfg.addSqlFunction( "count", new ClassicCountFunction()); <br />  classicCfg.addSqlFunction( "avg", new ClassicAvgFunction()); <br />  classicCfg.addSqlFunction( "sum", new ClassicSumFunction()); <br />  SessionFactory classicSf = classicCfg.buildSessionFactory(); <br /><br />或</p>
		<p>int count = ((Integer)q.uniqueResult()).intValue();</p>
		<p>改成 int count = ((Number)q.uniqueResult()).intValue(); 这样就可以两个版本同时兼容.<br /><br />2,hibernate3.2要求ehcache1.2</p>
		<p>3,session.createSQLQuery(sql).executeUpdate();这个hibernate3.0.5不支持,而hibernate3.2支持</p>
		<p>  session.createSQLQuery(fsql).addScalar("singlevalue",<br />                        Hibernate.DOUBLE).uniqueResult();这个到了3.2就不需要addScalar了.</p>
		<p>4,session.createSQLQuery(sql).addEntity(Class class);hibernate3.0.5不支持，单个参数的addEntity方法</p>
		<p>5，hibernate3.2可以对原生sql 查询使用ResultTransformer。这会返回不受Hibernate管理的实体。<br />sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")<br />        .setResultTransformer(Transformers.aliasToBean(CatDTO.class))</p>
		<p>或setResultTransformer(new AliasToBeanResultTransformer(CatDTO.class))<br />上面的查询将会返回CatDTO的列表,它将被实例化并且将NAME和BIRTHDAY的值注射入对应的属性或者字段。 <br /><a href="http://bbs.xml.org.cn/blog/more.asp?name=lhwork&amp;id=15351">http://bbs.xml.org.cn/blog/more.asp?name=lhwork&amp;id=15351</a></p>
		<pre class="wikiPreformatted">但必须注意，对每一个列都必须addScalar("列名")<br /></pre>
		<p>
				6，setResultTransformer与addEntity的一个区别是前者支持查任意的列，后者必须用select * from users的形式或select {a.*},{b.*} from a,b where ....。<br /></p>
		<p>7,Map vs. Object[]<br /></p>
		<p>Since you can also use a transformer that return a Map from alias to
value/entity (e.g. Transformers.ALIAS_TO_MAP), you are no longer
required to mess with index based Object arrays when working with a
result. </p>
		<blockquote>
				<pre>List iter = s.createQuery(<br />  "select e.student.name as studentName," +<br />  "       e.course.description as courseDescription" +<br />  "from   Enrolment as e")<br />  .setResultTransformer( Transformers.ALIAS_TO_MAP )<br />  .iterate();<br /><br />String name = (Map)(iter.next()).get("studentName");<br /></pre>
		</blockquote>
		<p>Again, this works equally well for Criteria, HQL and native SQL. </p>
		<p> </p>
<img src ="http://www.blogjava.net/leekiang/aggbug/151197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2007-10-09 02:03 <a href="http://www.blogjava.net/leekiang/archive/2007/10/09/151197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate问题</title><link>http://www.blogjava.net/leekiang/archive/2007/09/28/148919.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Thu, 27 Sep 2007 19:51:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2007/09/28/148919.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/148919.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2007/09/28/148919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/148919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/148919.html</trackback:ping><description><![CDATA[1,get一个对象并打算修改这个对象时，hibernate会判断该对象的属性值是否有变动，如果没有任何变动，hibernate不会执行update语句。在同时修改页面上的多条记录时可发现这一点。<br /><br />2,执行以下语句时hibernate3.0.5会报错,而3.2不会<br />sql="select 1+1 from dual";<br />session.createSQLQuery(sql).uniqueResult()<br />报错:addScalar() or addEntity() must be called on a sql query before executing the query.<br /><br />3,&lt;many-to-one&gt; 的lazy设置为true时，get子对象不会把该父对象抓过来,但可以手动写代码抓取父对象<br />如 Son son =(Son)this.getHibernateTemplate().get(Son.class, id);<br />       然后执行 son.getParent().getName();<br />   这样不仅仅会抓取到name,其他所有的属性如age,sex等都会取到，即用p.getParent().getAge()达到了同样的效果，后台都执行了select * from parent where id=?   注意用p.getParent()仅能得到parent的id.<br />   这时debug查看parent对象的内存快照,看到的是一个用cglib实现的代理对象,<br />Hibernate通过使用CGLIB,来实现动态构造一个目标对象的代理类对象，并且在代理类对象中包含目标对象的所有属性和方法，而且所有属性均被赋值为null。通过调试器显示的内存快照，我们可以看出此时真正的User对象，是包含在代理对象的CGLIB$CALBACK_0.target属性中，当调用son.getName()方法，这时通过CGLIB赋予的回调机制，实际上调用CGLIB$CALBACK_0.getName()方法，当调用该方法时，Hibernate会首先检查CGLIB$CALBACK_0.target属性是否为null，如果不为空，则调用目标对象的getName方法，如果为空，则会发起数据库查询，生成类似这样的SQL语句：select * from parent where id=’1’;来查询数据，并构造目标对象，并且将它赋值到CGLIB$CALBACK_0.target属性中。<br />这样，通过一个中间代理对象，Hibernate实现了实体的延迟加载，只有当用户真正发起获得实体对象属性的动作时，才真正会发起数据库查询操作。<br />    <span style="color: rgb(0, 16, 255);">&lt;many-to-one&gt; 的lazy设置为false时,抓取父对象没有采用代理机制。<br /></span><span style="background-color: rgb(255, 255, 255);"></span><br />4,用session.close()，执行多次查询后报session is closed的错误,而hibernateSessionFactory.closeSession()没有这个问题，这是什么原因?<br /><br />5,ORA-01466: 无法读数据 - 表定义已更改<br />原因是系统时间修改造成的，其他原因详见<br />http://www.orafaq.com/usenet/comp.databases.oracle.server/2007/03/31/1586.htm<br /><br />6,<br />spring的一个方法上有事务，先用hibernate加载一个对象，接着改变对象的某个属性的值，<br />再用sql去数据库查对应的记录，然后才提交。<br />用sql去查时发现对应的字段也改变了，这是怎么回事？<br /><br /><br />   <br /><img src ="http://www.blogjava.net/leekiang/aggbug/148919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2007-09-28 03:51 <a href="http://www.blogjava.net/leekiang/archive/2007/09/28/148919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate批量处理(转)</title><link>http://www.blogjava.net/leekiang/archive/2007/09/27/148688.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Thu, 27 Sep 2007 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2007/09/27/148688.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/148688.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2007/09/27/148688.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/148688.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/148688.html</trackback:ping><description><![CDATA[在做大批量处理时，容易出现outofmemory的情况，分析及解决如下 <br />（1）原因 <br /> 当首次作Insertupdatedeleteselect时，新产生的object在session关闭之前将自动装载到session级别的缓存区，如果，AP使用了二级缓存，同样也会装入到二级缓存。所以当数据量大时，就会出现outofmemory情况。 <br />  <br />（2）解决方法 <br />  <br />(A)批量插入（Batch inserts）/批量更新（Batch updates） <br />必须通过经常的调用 <tt class="literal"><font face="新宋体">flush()</font></tt> 以及稍后调用 <tt class="literal"><font face="新宋体">clear()</font></tt> 来控制第一级缓存的大小 <br />如： <br />Session session = sessionFactory.openSession();<br />Transaction tx = session.beginTransaction();<br />   <br />for ( int i=0; i&lt;100000; i++ ) {<br />    Customer customer = new Customer(.....);<br />    session.save(customer);<br />    if ( i % 20 == 0 ) { <br />//20, same as the JDBC batch size //20,与JDBC批量设置相同<br />        //flush a batch of inserts and release memory:<br />        //将本批插入的对象立即写入数据库并释放内存<br />        session.flush();<br />        session.clear();<br />    }<br />}<br />   <br />tx.commit();<br />session.close(); <br />  <br />(B)大批量更新/删除（Bulk update/delete） <br />使用HQL语言 <br />  <pre class="programlisting">Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();

        String hqlUpdate = "update Customer set name = :newName where name = :oldName";
        int updatedEntities = s.createQuery( hqlUpdate )
                            .setString( "newName", newName )
                            .setString( "oldName", oldName )
                            .executeUpdate();
        tx.commit();
        session.close();</pre><br />执行一个HQL <tt class="literal"><font face="新宋体">DELETE</font></tt>，同样使用 <tt class="literal"><font face="新宋体">Query.executeUpdate()</font></tt> 方法 （此方法是为 那些熟悉JDBC <tt class="literal"><font face="新宋体">PreparedStatement.executeUpdate()</font></tt> 的人们而设定的） <pre class="programlisting">Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();

        String hqlDelete = "delete Customer where name = :oldName";
        int deletedEntities = s.createQuery( hqlDelete )
                            .setString( "oldName", oldName )
                            .executeUpdate();
        tx.commit();
        session.close();</pre><img src ="http://www.blogjava.net/leekiang/aggbug/148688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2007-09-27 14:22 <a href="http://www.blogjava.net/leekiang/archive/2007/09/27/148688.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mant-to-one not-found</title><link>http://www.blogjava.net/leekiang/archive/2007/06/08/122947.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Fri, 08 Jun 2007 14:48:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2007/06/08/122947.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/122947.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2007/06/08/122947.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/122947.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/122947.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">mant-to-one元素有一个属性:not-found。<br>用来指定引用的外键不存在时将如何处理：<br>exception（默认）抛出异常<br>ignore 忽略<br>Hibernate就采用默认的抛出异常来处理</span>
<img src ="http://www.blogjava.net/leekiang/aggbug/122947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2007-06-08 22:48 <a href="http://www.blogjava.net/leekiang/archive/2007/06/08/122947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>摘录</title><link>http://www.blogjava.net/leekiang/archive/2007/04/29/114590.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sun, 29 Apr 2007 07:55:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2007/04/29/114590.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/114590.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2007/04/29/114590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/114590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/114590.html</trackback:ping><description><![CDATA[<p>摘录自&nbsp;<a href="http://www.javaeye.com/topic/73047?page=7">http://www.javaeye.com/topic/73047?page=7</a><br>&nbsp;&nbsp;&nbsp; 在实际使用Hibernate的例子中，我比较倾向于使用单个的PO，PO的逻辑关系由程序保证。当然这种设计不符合 Hibernate的思想，不过我的目的是解决问题，根据实际经验来看，这样做在项目中更有实际价值。我用Hibernate的目的只是不想写那么多Jdbc操作，我不打算用他来封装我的业务关系。我的业务逻辑体现是在数据库设计上体现。而程序开发的时候，表的关系是遵循模型设计开发，模型设计中会强制要求开发人员必须遵守模型的关系规则。虽然这样，会在代码中有很多不雅的代码（比起在PO表达对象关系来说），但是我觉得更可控。</p>
<img src ="http://www.blogjava.net/leekiang/aggbug/114590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2007-04-29 15:55 <a href="http://www.blogjava.net/leekiang/archive/2007/04/29/114590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>