﻿<?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-LoveJava-LoveLife-文章分类-Hibernate</title><link>http://www.blogjava.net/michaellee/category/38542.html</link><description>java人生路...MichaelLee</description><language>zh-cn</language><lastBuildDate>Wed, 25 Mar 2009 16:23:08 GMT</lastBuildDate><pubDate>Wed, 25 Mar 2009 16:23:08 GMT</pubDate><ttl>60</ttl><item><title>hibernate持久层操作</title><link>http://www.blogjava.net/michaellee/articles/261976.html</link><dc:creator>MichaelLee</dc:creator><author>MichaelLee</author><pubDate>Wed, 25 Mar 2009 16:09:00 GMT</pubDate><guid>http://www.blogjava.net/michaellee/articles/261976.html</guid><wfw:comment>http://www.blogjava.net/michaellee/comments/261976.html</wfw:comment><comments>http://www.blogjava.net/michaellee/articles/261976.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/michaellee/comments/commentRss/261976.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/michaellee/services/trackbacks/261976.html</trackback:ping><description><![CDATA[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>&nbsp;</p>
<p>&nbsp;</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>&nbsp;</p>
<p>&nbsp;</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>&nbsp;</p>
<p>&nbsp;</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>&nbsp;</p>
<p>&nbsp;</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>&nbsp;</p>
<p>&nbsp;</p>
<hr />
<p>&nbsp;</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/michaellee/aggbug/261976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/michaellee/" target="_blank">MichaelLee</a> 2009-03-26 00:09 <a href="http://www.blogjava.net/michaellee/articles/261976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate实体对象生命周期Transient/Persistent/Detached</title><link>http://www.blogjava.net/michaellee/articles/261975.html</link><dc:creator>MichaelLee</dc:creator><author>MichaelLee</author><pubDate>Wed, 25 Mar 2009 16:08:00 GMT</pubDate><guid>http://www.blogjava.net/michaellee/articles/261975.html</guid><wfw:comment>http://www.blogjava.net/michaellee/comments/261975.html</wfw:comment><comments>http://www.blogjava.net/michaellee/articles/261975.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/michaellee/comments/commentRss/261975.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/michaellee/services/trackbacks/261975.html</trackback:ping><description><![CDATA[实体对象的生命周期有三种状态：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.<a title="搜索该标签相关文章" href="http://www.bokee.net/searchmodule/weblog/search_search.do?query=Transient&amp;type=3"><span style="text-decoration: underline">Transient</span></a>（自由状态）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此时的实体对象和数据库中的记录无关联，只是一个普通的JavaBean。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.<a title="搜索该标签相关文章" href="http://www.bokee.net/searchmodule/weblog/search_search.do?query=Persistent&amp;type=3"><span style="text-decoration: underline">Persistent</span></a>（持久状态）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此时的实体对象和数据库中的记录有关联，其变更将由Hibernate固化到数据库中。该实体对象处于由Hibernate框架所管理的状态。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.Detached（游离状态）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;处于Persistent状态的对象，其对应的Session实例关闭之后，那么，此对象就处于"Detached"状态。Detached状态和Transient状态的区别在于Detached状态的对象可以再次与某个Session实例相关联而成为Persistent对象。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从实体对象是否被纳入Hibernate实体管理容器的角度，Transient和Detached状态的实体对象可以统称为VO（Value Object），而被管理的实体对象称为PO（Persistent Object）。两者的区别：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.VO是相对独立的实体对象，处于非管理状态。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.PO是Hibernate纳入其实体管理容器（Entity Map）的对象，它代表了与数据库中某条记录对应的Hibernate实体，PO的变化在事务提交时将反映到实际数据库中。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.如果一个PO与其对应的Session实例分离，那么此时，它又会变成一个VO。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下图是我画的实体对象生命周期的状态转换图：<br />
<br />
<img height="323" alt="vopolife.JPG" src="http://www.blogjava.net/images/blogjava_net/georgehill/temp/vopolife.JPG" width="553" border="0" />
<img src ="http://www.blogjava.net/michaellee/aggbug/261975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/michaellee/" target="_blank">MichaelLee</a> 2009-03-26 00:08 <a href="http://www.blogjava.net/michaellee/articles/261975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate实体对象生命周期Transient/Persistent/Detached</title><link>http://www.blogjava.net/michaellee/articles/261973.html</link><dc:creator>MichaelLee</dc:creator><author>MichaelLee</author><pubDate>Wed, 25 Mar 2009 16:04:00 GMT</pubDate><guid>http://www.blogjava.net/michaellee/articles/261973.html</guid><wfw:comment>http://www.blogjava.net/michaellee/comments/261973.html</wfw:comment><comments>http://www.blogjava.net/michaellee/articles/261973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/michaellee/comments/commentRss/261973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/michaellee/services/trackbacks/261973.html</trackback:ping><description><![CDATA[实体对象的生命周期有三种状态：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.<a title="搜索该标签相关文章" href="http://www.bokee.net/searchmodule/weblog/search_search.do?query=Transient&amp;type=3"><span style="text-decoration: underline">Transient</span></a>（自由状态）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此时的实体对象和数据库中的记录无关联，只是一个普通的JavaBean。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.<a title="搜索该标签相关文章" href="http://www.bokee.net/searchmodule/weblog/search_search.do?query=Persistent&amp;type=3"><span style="text-decoration: underline">Persistent</span></a>（持久状态）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此时的实体对象和数据库中的记录有关联，其变更将由Hibernate固化到数据库中。该实体对象处于由Hibernate框架所管理的状态。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.Detached（游离状态）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;处于Persistent状态的对象，其对应的Session实例关闭之后，那么，此对象就处于"Detached"状态。Detached状态和Transient状态的区别在于Detached状态的对象可以再次与某个Session实例相关联而成为Persistent对象。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从实体对象是否被纳入Hibernate实体管理容器的角度，Transient和Detached状态的实体对象可以统称为VO（Value Object），而被管理的实体对象称为PO（Persistent Object）。两者的区别：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.VO是相对独立的实体对象，处于非管理状态。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.PO是Hibernate纳入其实体管理容器（Entity Map）的对象，它代表了与数据库中某条记录对应的Hibernate实体，PO的变化在事务提交时将反映到实际数据库中。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.如果一个PO与其对应的Session实例分离，那么此时，它又会变成一个VO。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下图是我画的实体对象生命周期的状态转换图：<br />
<br />
<img height="323" alt="vopolife.JPG" src="http://www.blogjava.net/images/blogjava_net/georgehill/temp/vopolife.JPG" width="553" border="0" />
 <img src ="http://www.blogjava.net/michaellee/aggbug/261973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/michaellee/" target="_blank">MichaelLee</a> 2009-03-26 00:04 <a href="http://www.blogjava.net/michaellee/articles/261973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>