﻿<?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-DANCE WITH JAVA-随笔分类-dao层框架</title><link>http://www.blogjava.net/dreamstone/category/24598.html</link><description>开发出高质量的系统</description><language>zh-cn</language><lastBuildDate>Wed, 22 Jun 2011 06:26:00 GMT</lastBuildDate><pubDate>Wed, 22 Jun 2011 06:26:00 GMT</pubDate><ttl>60</ttl><item><title>hibernate事务管理  (jdbc   jta)</title><link>http://www.blogjava.net/dreamstone/archive/2007/07/29/133077.html</link><dc:creator>dreamstone</dc:creator><author>dreamstone</author><pubDate>Sat, 28 Jul 2007 17:58:00 GMT</pubDate><guid>http://www.blogjava.net/dreamstone/archive/2007/07/29/133077.html</guid><wfw:comment>http://www.blogjava.net/dreamstone/comments/133077.html</wfw:comment><comments>http://www.blogjava.net/dreamstone/archive/2007/07/29/133077.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamstone/comments/commentRss/133077.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamstone/services/trackbacks/133077.html</trackback:ping><description><![CDATA[hibernate的两种事务管理jdbc 和jta方式。下边说说两者的区别<br>一、说明一下jdbc和jta方式事务管理的区别：<br>JDBC事务由Connnection管理，也就是说，事务管理实际上是在JDBC Connection<br>中实现。事务周期限于Connection的生命周期之内<br><br>JTA 事务管理则由 JTA 容器实现，JTA 容器对当前加入事务的众多Connection 进<br>行调度，实现其事务性要求。JTA的事务周期可横跨多个JDBC Connection生命周期。<br><br>二、在了解jdbc和jta事务的基础上，再来讨论hibernate的两种事务<br>对于基于JDBC Transaction的Hibernate 事务管理机制而言，事务管理在Session 所依托的JDBC Connection<br>中实现，事务周期限于Session的生命周期。<br><br>对于基于JTA事务的Hibernate而言，JTA事务横跨可横跨多个Session。<br>三、hibernate中写法的不同<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">jdbc的写法<br><img id=Codehighlighter1_30_180_Open_Image onclick="this.style.display='none'; Codehighlighter1_30_180_Open_Text.style.display='none'; Codehighlighter1_30_180_Closed_Image.style.display='inline'; Codehighlighter1_30_180_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_30_180_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_30_180_Closed_Text.style.display='none'; Codehighlighter1_30_180_Open_Image.style.display='inline'; Codehighlighter1_30_180_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">void</span><span style="COLOR: #000000">&nbsp;saveUser()</span><span id=Codehighlighter1_30_180_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_30_180_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;session&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;Transaction&nbsp;tx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;session.beginTransaction();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;session.save(user);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;tx.commit();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;session.close();<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>必须在session.close()之前commit或者rollback<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>jta写法<br><img id=Codehighlighter1_248_495_Open_Image onclick="this.style.display='none'; Codehighlighter1_248_495_Open_Text.style.display='none'; Codehighlighter1_248_495_Closed_Image.style.display='inline'; Codehighlighter1_248_495_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_248_495_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_248_495_Closed_Text.style.display='none'; Codehighlighter1_248_495_Open_Image.style.display='inline'; Codehighlighter1_248_495_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">void</span><span style="COLOR: #000000">&nbsp;saveUser()</span><span id=Codehighlighter1_248_495_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_248_495_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;session&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;Transaction&nbsp;tx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;session.beginTransaction();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;session.save(user);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session1&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;session1.save(user1);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;tx.commit();<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>commit和rollback可以在session.close()之后执行.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>同时应该注意的一点是，事务是不能嵌套的，在使用jta的事务的情况下，如果要让一个事务跨越两个<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>session,则必须在两个session的外层开始事务和完成事务。而不能再在session内部开始事务和完成事务。</span></div>
<br><br><br><br>
<img src ="http://www.blogjava.net/dreamstone/aggbug/133077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamstone/" target="_blank">dreamstone</a> 2007-07-29 01:58 <a href="http://www.blogjava.net/dreamstone/archive/2007/07/29/133077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate open session in view 抛出异常解决方法</title><link>http://www.blogjava.net/dreamstone/archive/2007/07/29/133074.html</link><dc:creator>dreamstone</dc:creator><author>dreamstone</author><pubDate>Sat, 28 Jul 2007 16:52:00 GMT</pubDate><guid>http://www.blogjava.net/dreamstone/archive/2007/07/29/133074.html</guid><wfw:comment>http://www.blogjava.net/dreamstone/comments/133074.html</wfw:comment><comments>http://www.blogjava.net/dreamstone/archive/2007/07/29/133074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamstone/comments/commentRss/133074.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamstone/services/trackbacks/133074.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;在使用open-session-in-view的时候，如果使用不当，有可能抛出两种异常<br>1，NonUniqueObjectException<br>2，在配合spring使用的时候会可能会抛出org.<span class=me1>springframework</span>.<span class=me1>dao</span>.<span class=me1>InvalidDataAccessApiUsageException<br><br>先说1，这个异常的抛出原因和解决办法见这里：<br><font color=#002c99>javaeye</font>上有了很好的事例:<a href="http://www.javaeye.com/topic/11581">http://www.javaeye.com/topic/11581<font color=#000000> </font></a><br>解决办法可以用merge，也可以别的办法。<br>出现的原因，可以参考一下我前边的文章中将merge和update的区别的内容。<br><a href="http://www.blogjava.net/dreamstone/archive/2007/07/29/133071.html">http://www.blogjava.net/dreamstone/archive/2007/07/29/133071.html</a><br><br>2的解决办法：在这里<br>springside的一篇文章做了详细说明<br><a href="http://calvin.blog.javascud.org/post/46.htm">http://calvin.blog.javascud.org/post/46.htm</a><br><br>好了，现在问题解决了，但关于open-session-in-view的使用还有一些探讨，是否应该使用，使用的好处与坏处。<br>见这两篇jdon上的文章:<br><a href="http://www.jdon.com/jivejdon/thread/22374.html">http://www.jdon.com/jivejdon/thread/22374.html</a><br><a href="http://www.jdon.com/jivejdon/thread/28955.html">http://www.jdon.com/jivejdon/thread/28955.html</a><br></span>
<img src ="http://www.blogjava.net/dreamstone/aggbug/133074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamstone/" target="_blank">dreamstone</a> 2007-07-29 00:52 <a href="http://www.blogjava.net/dreamstone/archive/2007/07/29/133074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate的各种保存方式的区别  (save,persist,update,saveOrUpdte,merge,flush,lock)等</title><link>http://www.blogjava.net/dreamstone/archive/2007/07/29/133071.html</link><dc:creator>dreamstone</dc:creator><author>dreamstone</author><pubDate>Sat, 28 Jul 2007 16:19:00 GMT</pubDate><guid>http://www.blogjava.net/dreamstone/archive/2007/07/29/133071.html</guid><wfw:comment>http://www.blogjava.net/dreamstone/comments/133071.html</wfw:comment><comments>http://www.blogjava.net/dreamstone/archive/2007/07/29/133071.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamstone/comments/commentRss/133071.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamstone/services/trackbacks/133071.html</trackback:ping><description><![CDATA[<p>hibernate的保存<br />hibernate对于对象的保存提供了太多的方法，他们之间有很多不同，这里细说一下，以便区别：<br />一、预备知识：<br />在所有之前，说明一下，对于hibernate，它的对象有三种状态，transient、persistent、detached<br />下边是常见的翻译办法：<br />transient：瞬态或者自由态<br />persistent：持久化状态<br />detached：脱管状态或者游离态</p>
<p>游离状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。<br />持久化实例可以通过调用 delete()变成脱管状态。通过get()或load()方法得到的实例都是持久化状态的。<br />脱管状态的实例可以通过调用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。</p>
<p>save()和persist()将会引发SQL的INSERT，delete()会引发SQLDELETE，<br />而update()或merge()会引发SQLUPDATE。对持久化（persistent）实例的修改在刷新提交的时候会被检测到，<br />它也会引起SQLUPDATE。saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE</p>
<p>二、save 和update区别<br />把这一对放在第一位的原因是因为这一对是最常用的。<br />save的作用是把一个新的对象保存<br />update是把一个脱管状态的对象保存</p>
<p>三,update 和saveOrUpdate区别<br />这个是比较好理解的，顾名思义，saveOrUpdate基本上就是合成了save和update<br />引用hibernate reference中的一段话来解释他们的使用场合和区别<br />通常下面的场景会使用update()或saveOrUpdate()： <br />程序在第一个session中加载对象 <br />该对象被传递到表现层 <br />对象发生了一些改动 <br />该对象被返回到业务逻辑层 <br />程序调用第二个session的update()方法持久这些改动 </p>
<p>saveOrUpdate()做下面的事: <br />如果对象已经在本session中持久化了，不做任何事 <br />如果另一个与本session关联的对象拥有相同的持久化标识(identifier)，抛出一个异常 <br />如果对象没有持久化标识(identifier)属性，对其调用save() <br />如果对象的持久标识(identifier)表明其是一个新实例化的对象，对其调用save() <br />如果对象是附带版本信息的（通过&lt;version&gt;或&lt;timestamp&gt;） 并且版本属性的值表明其是一个新实例化的对象，save()它。 <br />否则update() 这个对象 </p>
<p>四,persist和save区别<br />这个是最迷离的一对，表面上看起来使用哪个都行，在hibernate reference文档中也没有明确的区分他们.<br />这里给出一个明确的区分。（可以跟进src看一下，虽然实现步骤类似，但是还是有细微的差别）<br />这里参考<a href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682">http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682</a>中的一个说明：<br />---------------------------------------------------------------------------------<br />I found that a lot of people have the same doubt. To help to solve this issue <br />I'm quoting Christian Bauer:<br />"In case anybody finds this thread...</p>
<p>persist() is well defined. It makes a transient instance persistent. However, <br />it doesn't guarantee that the identifier value will be assigned to the persistent <br />instance immediately, the assignment might happen at flush time. The spec doesn't say <br />that, which is the problem I have with persist().</p>
<p>persist() also guarantees that it will not execute an INSERT statement if it is <br />called outside of transaction boundaries. This is useful in long-running conversations <br />with an extended Session/persistence context.A method like persist() is required.</p>
<p>save() does not guarantee the same, it returns an identifier, and if an INSERT <br />has to be executed to get the identifier (e.g. "identity" generator, not "sequence"), <br />this INSERT happens immediately, no matter if you are inside or outside of a transaction. This is not good in a long-running conversation with an extended Session/persistence context."</p>
<p>---------------------------------------------------------------------------------<br />简单翻译一下上边的句子的主要内容：<br />1，persist把一个瞬态的实例持久化，但是并"不保证"标识符被立刻填入到持久化实例中，标识符的填入可能被推迟<br />到flush的时间。</p>
<p>2，persist"保证"，当它在一个transaction外部被调用的时候并不触发一个Sql Insert，这个功能是很有用的，<br />当我们通过继承Session/persistence context来封装一个长会话流程的时候，一个persist这样的函数是需要的。</p>
<p>3，save"不保证"第2条,它要返回标识符，所以它会立即执行Sql insert，不管是不是在transaction内部还是外部</p>
<p><br />五,saveOrUpdateCopy,merge和update区别<br />首先说明merge是用来代替saveOrUpdateCopy的，这个详细见这里<br /><a href="http://www.blogjava.net/dreamstone/archive/2007/07/28/133053.html">http://www.blogjava.net/dreamstone/archive/2007/07/28/133053.html</a><br />然后比较update和merge<br />update的作用上边说了，这里说一下merge的<br />如果session中存在相同持久化标识(identifier)的实例，用用户给出的对象的状态覆盖旧有的持久实例 <br />如果session没有相应的持久实例，则尝试从数据库中加载，或创建新的持久化实例,最后返回该持久实例 <br />用户给出的这个对象没有被关联到session上，它依旧是脱管的 <br />重点是最后一句：<br />当我们使用update的时候，执行完成后，我们提供的对象A的状态变成持久化状态<br />但当我们使用merge的时候，执行完成，我们提供的对象A还是脱管状态，hibernate或者new了一个B，或者检索到<br />一个持久对象B，并把我们提供的对象A的所有的值拷贝到这个B，执行完成后B是持久状态，而我们提供的A还是托管状态</p>
<p>六,flush和update区别<br />这两个的区别好理解<br />update操作的是在脱管状态的对象<br />而flush是操作的在持久状态的对象。<br />默认情况下，一个持久状态的对象是不需要update的，只要你更改了对象的值，等待hibernate flush就自动<br />保存到数据库了。hibernate flush发生再几种情况下：<br />1，调用某些查询的时候<br />2，transaction commit的时候<br />3，手动调用flush的时候 </p>
<p>七,lock和update区别<br />update是把一个已经更改过的脱管状态的对象变成持久状态<br />lock是把一个没有更改过的脱管状态的对象变成持久状态<br />对应更改一个记录的内容，两个的操作不同：<br />update的操作步骤是：<br />（1）更改脱管的对象-&gt;调用update<br />lock的操作步骤是：<br />(2)调用lock把对象从脱管状态变成持久状态--&gt;更改持久状态的对象的内容--&gt;等待flush或者手动flush</p>
<p>参考内容：<br /><a href="http://www.blogjava.net/iamtin/archive/2006/03/06/33910.aspx">http://www.blogjava.net/iamtin/archive/2006/03/06/33910.aspx</a><br /><a href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682">http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682</a><br /><a href="http://www.redsaga.com/hibernate-ref/3.x/zh-cn/html/objectstate.html">http://www.redsaga.com/hibernate-ref/3.x/zh-cn/html/objectstate.html</a></p><img src ="http://www.blogjava.net/dreamstone/aggbug/133071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamstone/" target="_blank">dreamstone</a> 2007-07-29 00:19 <a href="http://www.blogjava.net/dreamstone/archive/2007/07/29/133071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate的查询 （比较get 与load)</title><link>http://www.blogjava.net/dreamstone/archive/2007/07/28/133062.html</link><dc:creator>dreamstone</dc:creator><author>dreamstone</author><pubDate>Sat, 28 Jul 2007 15:04:00 GMT</pubDate><guid>http://www.blogjava.net/dreamstone/archive/2007/07/28/133062.html</guid><wfw:comment>http://www.blogjava.net/dreamstone/comments/133062.html</wfw:comment><comments>http://www.blogjava.net/dreamstone/archive/2007/07/28/133062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamstone/comments/commentRss/133062.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamstone/services/trackbacks/133062.html</trackback:ping><description><![CDATA[<p><span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: #ee6600; PADDING-TOP: 0px; BACKGROUND-COLOR: yellow; EE6600: ">hibernate</span>的查询的比较<br><span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: #ee6600; PADDING-TOP: 0px; BACKGROUND-COLOR: yellow; EE6600: ">hibernate</span>的查询有很多,Query,<span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: red; PADDING-TOP: 0px; BACKGROUND-COLOR: #ffeeee; red: ">find</span>,Criteria,get,<span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: blue; PADDING-TOP: 0px; BACKGROUND-COLOR: #ccffff; blue: ">load</span></p>
<p>query使用hsql语句，可以设置参数是常用的一种方式</p>
<p>criteria的方式，尽量避免了写hql语句，看起来更面向对象了。</p>
<p><span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: red; PADDING-TOP: 0px; BACKGROUND-COLOR: #ffeeee; red: ">find</span>方式，这种方式已经被新的<span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: #ee6600; PADDING-TOP: 0px; BACKGROUND-COLOR: yellow; EE6600: ">hibernate</span>丢弃见这里<br><a href="http://www.blogjava.net/dreamstone/archive/2007/07/28/133053.html">http://www.blogjava.net/dreamstone/archive/2007/07/28/133053.html</a></p>
<p>get和<span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: blue; PADDING-TOP: 0px; BACKGROUND-COLOR: #ccffff; blue: ">load</span>方式是根据id取得一个记录<br>下边详细说一下get和<span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: blue; PADDING-TOP: 0px; BACKGROUND-COLOR: #ccffff; blue: ">load</span>的不同，因为有些时候为了对比也会把<span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: red; PADDING-TOP: 0px; BACKGROUND-COLOR: #ffeeee; red: ">find</span>加进来。</p>
<p>1，从返回结果上对比：<br><span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: blue; PADDING-TOP: 0px; BACKGROUND-COLOR: #ccffff; blue: ">load</span>方式检索不到的话会抛出org.<span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: #ee6600; PADDING-TOP: 0px; BACKGROUND-COLOR: yellow; EE6600: ">hibernate</span>.ObjectNotFoundException异常<br>get方法检索不到的话会返回null</p>
<p>2，从检索执行机制上对比：<br>get方法和<span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: red; PADDING-TOP: 0px; BACKGROUND-COLOR: #ffeeee; red: ">find</span>方法都是直接从数据库中检索<br>而<span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: blue; PADDING-TOP: 0px; BACKGROUND-COLOR: #ccffff; blue: ">load</span>方法的执行则比较复杂<br>1,首先查找session的persistent Context中是否有缓存，如果有则直接返回<br>2,如果没有则判断是否是lazy，如果不是直接访问数据库检索，查到记录返回，查不到抛出异常<br>3,如果是lazy则需要建立代理对象，对象的initialized属性为false，target属性为null<br>4, 在访问获得的代理对象的属性时,检索数据库，如果找到记录则把该记录的对象复制到代理对象的target<br>上，并将initialized=true，如果找不到就抛出异常 。<br></p>
<img src ="http://www.blogjava.net/dreamstone/aggbug/133062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamstone/" target="_blank">dreamstone</a> 2007-07-28 23:04 <a href="http://www.blogjava.net/dreamstone/archive/2007/07/28/133062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 3.2新的Session接口与之前接口的不同</title><link>http://www.blogjava.net/dreamstone/archive/2007/07/28/133053.html</link><dc:creator>dreamstone</dc:creator><author>dreamstone</author><pubDate>Sat, 28 Jul 2007 14:37:00 GMT</pubDate><guid>http://www.blogjava.net/dreamstone/archive/2007/07/28/133053.html</guid><wfw:comment>http://www.blogjava.net/dreamstone/comments/133053.html</wfw:comment><comments>http://www.blogjava.net/dreamstone/archive/2007/07/28/133053.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamstone/comments/commentRss/133053.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamstone/services/trackbacks/133053.html</trackback:ping><description><![CDATA[<p>hibernate 3中的session接口的不同<br>hibernate3.2版本中session出现了2个<br>新session接口：org.hibernate.Session<br>老session接口：org.hibernate.classic.Session<br>顾名思义，classic包下的session就是以前常用的session，新的这个相比老的有很大变化。下边详细列出<br>1，去掉了所有的find方法<br>在新的session接口中没有find方法，而在老的session接口中把find全部注释成deprecated了。<br>2,去掉所有的saveOrUpdateCopy，使用merge代替，这是classic.Session注释中的一段原话.<br>/**<br>&nbsp; * Copy the state of the given object onto the persistent object with the same<br>&nbsp; * identifier. If there is no persistent instance currently associated with<br>&nbsp; * the session, it will be loaded. Return the persistent instance. If the<br>&nbsp; * given instance is unsaved or does not exist in the database, save it and<br>&nbsp; * return it as a newly persistent instance. Otherwise, the given instance<br>&nbsp; * does not become associated with the session.<br>&nbsp; *<br>&nbsp; * @deprecated use <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#123;&#64;&#108;&#105;&#110;&#107;">{@link</a> org.hibernate.Session#merge(String, Object)}<br>&nbsp; *<br>&nbsp; * @param object a transient instance with state to be copied<br>&nbsp; * @return an updated persistent instance<br>&nbsp; */<br>注意这句：@deprecated use <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#123;&#64;&#108;&#105;&#110;&#107;">{@link</a> org.hibernate.Session#merge(String, Object)}<br>3,去掉了iterate方法<br>给出的注释是使用createQuery，自己获得iterate<br>4，去掉了filter方法<br>@deprecated use <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#123;&#64;&#108;&#105;&#110;&#107;">{@link</a> #createFilter(Object, String)}.{@link Query#list}<br>给出的注释说用createFilter代替，实际就是自己从createFilter获得query然后自己查询<br>5，增加了一些方法<br>具体自己看api吧，主要是提供了一些新的功能。<br>总结：<br>从上边的改变不难看出hibernate对于接口的设定观念改变了。</p>
<p>以前的策略是：<br>尽量给出全的接口，这样减少用户的代码量，所以filter直接返回collection，iterate直接返回<br>iterate。但这样的结果是过度的提供接口，造成了学习上的负担和选择上的负担。如何记住这些函数，如何在众多函数<br>中选择是个麻烦事情。<br>凡是做java的都知道，用一个java的东西最辛苦的是选择，在开源的世界里边选择一个适合自己的工程，再在这个选择的工程里边选择实现方法<br>因为可能提供很多种实现方法，而且有些还是deprecated的。</p>
<p>现在的策略：<br>尽量简化接口，或减少函数，或者简化函数名，例如把saveOrUpdateCopy变成merge。<br>这样的好处是记忆学习负担少。多写几句代码不是特别麻烦。其实我个人来讲更喜欢现在的感觉。<br>以前的策略其实很大程度上是满足程序员的个人需求，更有成就感。但确不适合使用者的需求。</p>
<p>ok，无论如何现在的情况是更好了。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/dreamstone/aggbug/133053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamstone/" target="_blank">dreamstone</a> 2007-07-28 22:37 <a href="http://www.blogjava.net/dreamstone/archive/2007/07/28/133053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>