﻿<?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-Owen-随笔分类-OpenSource</title><link>http://www.blogjava.net/absolutedo/category/37477.html</link><description>宝剑锋从磨砺出,梅花香自苦寒来。</description><language>zh-cn</language><lastBuildDate>Sat, 20 Nov 2010 21:49:51 GMT</lastBuildDate><pubDate>Sat, 20 Nov 2010 21:49:51 GMT</pubDate><ttl>60</ttl><item><title>Policy for init Spring Container in WEB Application</title><link>http://www.blogjava.net/absolutedo/archive/2010/09/13/331916.html</link><dc:creator>iowen</dc:creator><author>iowen</author><pubDate>Mon, 13 Sep 2010 10:10:00 GMT</pubDate><guid>http://www.blogjava.net/absolutedo/archive/2010/09/13/331916.html</guid><wfw:comment>http://www.blogjava.net/absolutedo/comments/331916.html</wfw:comment><comments>http://www.blogjava.net/absolutedo/archive/2010/09/13/331916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/absolutedo/comments/commentRss/331916.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/absolutedo/services/trackbacks/331916.html</trackback:ping><description><![CDATA[<p>Web应用初始化Spring容器策略<br />
<br />
以下软件测试环境为Spring,Struts1</p>
<p>1、通过struts1提供的插件机制，采用Spring提供的ContextLoaderPlugIn</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"&gt;</p>
<p>&lt;struts-config&gt;<br />
&nbsp;&lt;global-exceptions /&gt;<br />
&nbsp;&lt;global-forwards /&gt;<br />
&nbsp;&lt;message-resources parameter="com.portal.ApplicationResources" /&gt;<br />
&nbsp;&lt;!--&nbsp; 通过S1提供的插件机制来初始化Spring容器，加载Spring配置文件<br />
&nbsp;&lt;plug-in<br />
&nbsp;&nbsp;className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;<br />
&nbsp;&nbsp;&lt;!--<br />
&nbsp;&nbsp;&nbsp;1、ContextLoaderPlugIn默认加载配置文件命名规则是actionServlet-servlet.xml,其中actionServlet<br />
&nbsp;&nbsp;&nbsp;是配置org.apache.struts.action.ActionServlet时指定的servlet名称<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;2、通过配置contextConfigLocation属性来指点Spring配置文件的位置,多个配置文件可以使用 逗号","、分号";"、空格" "<br />
&nbsp;&nbsp;--&gt;<br />
&nbsp;&nbsp;&lt;set-property property="contextConfigLocation"<br />
&nbsp;&nbsp;&nbsp;value="/WEB-INF/conf/spring-application.xml,/WEB-INF/conf/**/spring*.xml" /&gt;<br />
&nbsp;&lt;/plug-in&gt;&nbsp;<br />
&nbsp; --&gt;<br />
&lt;/struts-config&gt;</p>
<p><br />
2、采用Spring提供的ContextLoaderListener来初始化(应用服务器需要支持Listener,Servlet2.3版本及以上)<br />
&nbsp;&lt;context-param&gt;<br />
&nbsp; &nbsp;&lt;description&gt;通过配置contextConfigLocation属性来指点Spring配置文件的位置,多个配置文件可以使用 逗号","、分号";"、空格" "&lt;/description&gt;<br />
&nbsp; &nbsp;&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
&nbsp; &nbsp;&lt;param-value&gt;/WEB-INF/conf/spring-application.xml /WEB-INF/conf/**/spring*.xml&lt;/param-value&gt;<br />
&nbsp; &lt;/context-param&gt;<br />
&nbsp; <br />
&nbsp; &lt;listener&gt;<br />
&nbsp; &nbsp;&lt;description&gt;通过ContextLocaderListener来初始化Spring容器，加载Spring配置文件&lt;/description&gt;<br />
&nbsp; &nbsp;&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />
&nbsp; &lt;/listener&gt;</p>
<p>3、采用load-on-startup Servlet 来初始化Spring容器<br />
&nbsp; &lt;servlet&gt;<br />
&nbsp; &nbsp;&lt;description&gt;<br />
&nbsp; &nbsp;&nbsp;通过load-on-startup Servlet来初始化Spring容器<br />
&nbsp; &nbsp;&nbsp;该如何Servlet 用于提供"后台"服务，作为容器管理应用中的其他bean，不需要响应客户请求，因此无须配置servlet-mapping<br />
&nbsp; &nbsp;&lt;/description&gt;<br />
&nbsp; &nbsp;&lt;servlet-name&gt;applicationContext&lt;/servlet-name&gt;<br />
&nbsp; &nbsp;&lt;servlet-class&gt;org.springframework.web.context.ContextLoaderServlet&lt;/servlet-class&gt;<br />
&nbsp; &nbsp;&lt;load-on-startup&gt;0&lt;/load-on-startup&gt;<br />
&nbsp; &lt;/servlet&gt;<br />
</p>
<img src ="http://www.blogjava.net/absolutedo/aggbug/331916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/absolutedo/" target="_blank">iowen</a> 2010-09-13 18:10 <a href="http://www.blogjava.net/absolutedo/archive/2010/09/13/331916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Study Note 1</title><link>http://www.blogjava.net/absolutedo/archive/2010/01/09/308863.html</link><dc:creator>iowen</dc:creator><author>iowen</author><pubDate>Sat, 09 Jan 2010 11:08:00 GMT</pubDate><guid>http://www.blogjava.net/absolutedo/archive/2010/01/09/308863.html</guid><wfw:comment>http://www.blogjava.net/absolutedo/comments/308863.html</wfw:comment><comments>http://www.blogjava.net/absolutedo/archive/2010/01/09/308863.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/absolutedo/comments/commentRss/308863.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/absolutedo/services/trackbacks/308863.html</trackback:ping><description><![CDATA[<p>&nbsp; </p>
<p style="text-align: center" class="MsoNormal" align="center"><span style="font-size: 16pt">Hibernate</span><span style="font-family: 宋体; font-size: 16pt">学习笔记</span></p>
<p style="text-indent: -21.75pt; margin-left: 21.75pt; tab-stops: list 21.75pt" class="MsoNormal"><span style="font-size: 14pt">1、</span><span style="font-size: 14pt">Hibernate</span><span style="font-family: 宋体; font-size: 14pt">核心类与接口</span><span style="font-size: 14pt">&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin-left: 10.5pt" class="MsoNormal"><strong><span style="font-size: 12pt">1-1.Configuration</span></strong><strong><span style="font-family: 宋体; font-size: 12pt">类</span></strong></p>
<p style="margin-left: 10.5pt" class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration<span style="font-family: 宋体">类是</span>Hibernate<span style="font-family: 宋体">的入口，它负责配置和启动</span>Hibernate,Hibernate<span style="font-family: 宋体">框架通过</span>Configuration<span style="font-family: 宋体">实例加载配置文件信息</span>(hibernate.cfg.xml),<span style="font-family: 宋体">然后读取指定对象关系映射文件</span>(bean.hbm.xml)<span style="font-family: 宋体">的内容并创建</span>SessionFactory.</p>
<p style="margin-left: 10.5pt" class="MsoNormal"><strong><span style="font-size: 12pt">1-2.SessionFactory</span></strong><strong><span style="font-family: 宋体; font-size: 12pt">接口</span></strong></p>
<p style="margin-left: 10.5pt" class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SessionFactory<span style="font-family: 宋体">接口负责初始化</span>Hibernate,<span style="font-family: 宋体">一个</span>SessionFactory<span style="font-family: 宋体">实例对应一个数据存储源</span>(<span style="font-family: 宋体">一般就是指一个数据库</span>)<span style="font-family: 宋体">。应用程序从</span>SessionFactory<span style="font-family: 宋体">中获得</span>Session<span style="font-family: 宋体">实例。</span>SessionFactory<span style="font-family: 宋体">具有以下特点：</span></p>
<p style="margin-left: 10.5pt" class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1)&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">线程安全，即同一个</span> SessionFactory<span style="font-family: 宋体">实例可以被应用</span> <span style="font-family: 宋体">的多个线程共享。</span></p>
<p style="margin-left: 10.5pt" class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2)&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">它是重量级的</span> <span style="font-family: 宋体">，因为它需要一个很大的缓存，用来存放预定义的</span>SQL<span style="font-family: 宋体">语句以及映射元数据等。</span></p>
<p style="margin-left: 10.5pt" class="MsoNormal"><span style="font-family: 宋体">所以说</span> <span style="font-family: 宋体">，如果一个应用程序中只访问一个数据库</span> <span style="font-family: 宋体">，则只需要创建一个全局的</span> SessionFactory<span style="font-family: 宋体">实例。</span></p>
<p style="margin-left: 10.5pt" class="MsoNormal"><strong><span style="font-size: 12pt">1-3.Session </span></strong><strong><span style="font-family: 宋体; font-size: 12pt">接口</span></strong></p>
<p style="margin-left: 10.5pt" class="MsoNormal">&nbsp;&nbsp;&nbsp; Session<span style="font-family: 宋体">是</span>Hibernate<span style="font-family: 宋体">中应用最频繁的接口。</span>Session<span style="font-family: 宋体">也被称为持久化管理器</span> <span style="font-family: 宋体">，它负责管理所有与持久化相关的操作：如存储、更新、删除和加载对象等。</span>Session<span style="font-family: 宋体">接口具有以下特点：</span></p>
<p style="margin-left: 10.5pt" class="MsoNormal">&nbsp;&nbsp;&nbsp; 1)&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">单线程，非共享的对象。线程不安全，在设计软件架构时候，应该避免多个线程共享同一个</span>session<span style="font-family: 宋体">实例。</span></p>
<p style="margin-left: 10.5pt" class="MsoNormal">&nbsp;&nbsp;&nbsp; 2)&nbsp;&nbsp;&nbsp; Session <span style="font-family: 宋体">实例是轻量级的，它的创建和销毁不需要消耗太多的资源。可以为每个请分配一个</span>Session<span style="font-family: 宋体">实例，在每次请求过程汇总及时创建和销毁</span> Session<span style="font-family: 宋体">实例。</span></p>
<p style="margin-left: 10.5pt" class="MsoNormal">&nbsp;&nbsp;&nbsp; 3)&nbsp;&nbsp;&nbsp; Session<span style="font-family: 宋体">有一个缓存，它存放当前工作单元加载的对象。</span>Session<span style="font-family: 宋体">的缓存被称为</span>Hibernate<span style="font-family: 宋体">的一级缓存。</span></p>
<p style="margin-left: 10.5pt" class="MsoNormal"><strong><span style="font-size: 12pt">1-4.Transaction</span></strong><strong><span style="font-family: 宋体; font-size: 12pt">接口</span></strong></p>
<p style="margin-left: 10.5pt" class="MsoNormal">&nbsp;&nbsp;&nbsp; Transaction<span style="font-family: 宋体">接口是</span> Hibernate<span style="font-family: 宋体">框架的事务接口。它对底层的事务接口做了封装，包括：</span>JDBC API<span style="font-family: 宋体">和</span>JTA.<span style="font-family: 宋体">这样使得</span>Hibernate<span style="font-family: 宋体">应用可以通过一致的</span>Transaction<span style="font-family: 宋体">接口来申明事务边界，这有助于应用程序再不同的环境和容器中移植。</span></p>
<p style="margin-left: 10.5pt" class="MsoNormal"><strong><span style="font-size: 12pt">1-5.Query</span></strong><strong><span style="font-family: 宋体; font-size: 12pt">和</span></strong><strong><span style="font-size: 12pt">Criteria</span></strong><strong><span style="font-family: 宋体; font-size: 12pt">接口</span></strong></p>
<p style="margin-left: 10.5pt" class="MsoNormal">&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">它们是</span> Hibernate<span style="font-family: 宋体">的查询接口，用于从数据存储源查询对象及控制执行查询的过程。</span>Query<span style="font-family: 宋体">包装了一个</span> HQL(Hibernate Query Language)<span style="font-family: 宋体">；而</span>Criteria<span style="font-family: 宋体">接口完全封装了基本字符串形式的查询语句，比</span>Query<span style="font-family: 宋体">更加面向对象，</span>Criteria<span style="font-family: 宋体">接口擅长于执行动态查询。</span></p>
<p style="text-indent: -21.75pt; margin-left: 21.75pt; tab-stops: list 21.75pt" class="MsoNormal"><span style="font-size: 14pt">2、</span><span style="font-size: 14pt">Hibernate</span><span style="font-family: 宋体; font-size: 14pt">中常用的事务隔离级别</span></p>
<p>
<table style="border-bottom: medium none; border-left: medium none; width: 419.4pt; border-collapse: collapse; border-top: medium none; border-right: medium none" class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0" width="559">
    <tbody>
        <tr>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 202.75pt; padding-right: 5.4pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="270">
            <p><span style="font-family: 宋体; font-size: 14pt">常量</span></p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 24.95pt; padding-right: 5.4pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="33">
            <p><span style="font-family: 宋体; font-size: 14pt">值</span></p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 191.7pt; padding-right: 5.4pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="256">
            <p><span style="font-family: 宋体; font-size: 14pt">说明</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 202.75pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="270">
            <p>TRANSACTION_NONE&nbsp;</p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 24.95pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="33">
            <p>0</p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 191.7pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="256">
            <p style="text-indent: 21pt" class="MsoNormal"><span style="font-family: 宋体">不支持事务</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 202.75pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="270">
            <p>TRANSACTION_READ_UNCOMMITTED</p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 24.95pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="33">
            <p>1</p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 191.7pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="256">
            <p style="text-indent: 21pt" class="MsoNormal"><span style="font-family: 宋体">指示可以发生脏读（</span>dirty read<span style="font-family: 宋体">）、不可重复读和虚读（</span>phantom read<span style="font-family: 宋体">）的常量。此级别允许被某一事务更改的行在已提交该行所有更改之前被另一个事务读取（&#8220;脏读&#8221;）。如果所有更改都被回滚，则第二个事务将获取无效的行。</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 202.75pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="270">
            <p>TRANSACTION_READ_COMMITTED</p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 24.95pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="33">
            <p>2</p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 191.7pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="256">
            <p style="text-indent: 21pt" class="MsoNormal"><span style="font-family: 宋体">指示不可以发生脏读的常量；不可重复读和虚读可以发生。此级别只禁止事务读取其中带有未提交更改的行。</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 202.75pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="270">
            <p>TRANSACTION_REPEATABLE_READ</p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 24.95pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="33">
            <p>4</p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 191.7pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="256">
            <p style="text-indent: 21pt" class="MsoNormal"><span style="font-family: 宋体">指示不可以发生脏读和不可重复读的常量；虚读可以发生。此级别禁止事务读取带有未提交更改的行，它还禁止这种情况：一个事务读取某一行，而另一个事务更改该行，第一个事务重新读取该行，并在第二次读取时获得不同的值（&#8220;不可重复读&#8221;）。</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 202.75pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="270">
            <p>TRANSACTION_SERIALIZABLE</p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 24.95pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="33">
            <p>8</p>
            </td>
            <td style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; width: 191.7pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm" valign="top" width="256">
            <p style="text-indent: 21pt" class="MsoNormal"><span style="font-family: 宋体">指示不可以发生脏读、不可重复读和虚读的常量。此级别包括</span>TRANSACTION_REPEATABLE_READ <span style="font-family: 宋体">中禁止的事项，同时还禁止出现这种情况：某一事务读取所有满足</span> WHERE <span style="font-family: 宋体">条件的行，另一个事务插入一个满足</span> WHERE <span style="font-family: 宋体">条件的行，第一个事务重新读取满足相同条件的行，并在第二次读取时获得额外的&#8220;虚&#8221;行。</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="text-indent: -21.75pt; margin-left: 21.75pt; tab-stops: list 21.75pt" class="MsoNormal"><span style="font-size: 14pt">3、</span><span style="font-size: 14pt">Hibernate</span><span style="font-family: 宋体; font-size: 14pt">中实例的状态</span><span style="font-size: 14pt"></p>
<p></span><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/absolutedo/11111.jpg" width="586" height="480" /></p>
<p style="margin-left: 10.5pt" class="MsoNormal"><strong><span style="font-size: 12pt">3-1</span></strong><strong><span style="font-family: 宋体; font-size: 12pt">：临时状态</span></strong></p>
<p style="margin-left: 10.5pt" class="MsoNormal"><strong><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong>&nbsp;<span style="font-family: 宋体">该实例从未与任何持久化上下文关联过。它没有持久化标识（相当于主键值），临时状态下的对象有如下特征。</span></p>
<p style="text-indent: -21pt; margin-left: 74.25pt; tab-stops: list 74.25pt" class="MsoNormal">1）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">不处于</span>Session<span style="font-family: 宋体">缓存中，也可以说不被任何一个</span>Session<span style="font-family: 宋体">关联</span></p>
<p style="text-indent: -21pt; margin-left: 74.25pt; tab-stops: list 74.25pt" class="MsoNormal">2）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">在数据库中没有对应的记录</span></p>
<p style="margin-left: 53.25pt" class="MsoNormal"><span style="font-family: 宋体">在以下情况下，</span>Java<span style="font-family: 宋体">对象进入临时状态</span></p>
<p style="text-indent: -18pt; margin-left: 71.25pt; tab-stops: list 71.25pt" class="MsoNormal">1）&nbsp;<span style="font-family: 宋体">当通过</span>new<span style="font-family: 宋体">语句刚创建一个</span>Java<span style="font-family: 宋体">对象，它处于临时状态，此时不和数据库中的任何记录对应。</span></p>
<p style="text-indent: -18pt; margin-left: 71.25pt; tab-stops: list 71.25pt" class="MsoNormal">2）&nbsp;Session<span style="font-family: 宋体">的</span>delete()<span style="font-family: 宋体">方法能使一个持久化或临时脱管对象转换为临时对象。对于脱管对象，</span>delete()<span style="font-family: 宋体">方法从数据库中删除与它对应的记录，并且把它从</span>Session<span style="font-family: 宋体">缓存中删除。</span></p>
<p style="margin-left: 10.5pt" class="MsoNormal"><strong><span style="font-size: 12pt">3-2</span></strong><strong><span style="font-family: 宋体; font-size: 12pt">：持久化状态</span></strong></p>
<p style="margin-left: 10.5pt" class="MsoNormal"><strong><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><span style="font-family: 宋体">该实例目前与某个持久化上下文有关联，它拥有持久化标识（相当于主键值），并且可能在数据库汇总有一个对应的行。对于某一个特定的持久化上下文，</span>Hibernate<span style="font-family: 宋体">保证标识与</span>Java<span style="font-family: 宋体">标识（其值代表对应在内存中的位置）等价。持久化对象有以下特征。</span></p>
<p style="text-indent: -18pt; margin-left: 71.25pt; tab-stops: list 71.25pt" class="MsoNormal">1）&nbsp;<span style="font-family: 宋体">位于一个</span>Session<span style="font-family: 宋体">实例的缓存中，也可以说，持久化对象总是被一个</span>Session<span style="font-family: 宋体">实例关联。</span></p>
<p style="text-indent: -18pt; margin-left: 71.25pt; tab-stops: list 71.25pt" class="MsoNormal">2）&nbsp;<span style="font-family: 宋体">持久化对象和数据库中的相关记录对应。</span></p>
<p style="text-indent: -18pt; margin-left: 71.25pt; tab-stops: list 71.25pt" class="MsoNormal">3）&nbsp;Session<span style="font-family: 宋体">在清理缓存时，会根据持久化对象的属性变化，来同步更新数据库。</span></p>
<p style="margin-left: 71.25pt" class="MsoNormal">Session<span style="font-family: 宋体">的许多方法都能够触发</span>Java<span style="font-family: 宋体">对象进入持久化状态。</span></p>
<p style="text-indent: -18pt; margin-left: 71.25pt; tab-stops: list 71.25pt" class="MsoNormal">4）&nbsp;Session<span style="font-family: 宋体">的</span>save()<span style="font-family: 宋体">的方法能够把临时对象转变成持久化对象。</span></p>
<p style="text-indent: -18pt; margin-left: 71.25pt; tab-stops: list 71.25pt" class="MsoNormal">5）&nbsp;Session<span style="font-family: 宋体">的</span>load()<span style="font-family: 宋体">或</span>get()<span style="font-family: 宋体">方法返回的对象总是处于持久化状态。</span></p>
<p style="text-indent: -18pt; margin-left: 71.25pt; tab-stops: list 71.25pt" class="MsoNormal">6）&nbsp;Query<span style="font-family: 宋体">类的</span>list()<span style="font-family: 宋体">方法返回的</span>list<span style="font-family: 宋体">集合中存放的都是持久化对象。</span></p>
<p style="text-indent: -18pt; margin-left: 71.25pt; tab-stops: list 71.25pt" class="MsoNormal">7）&nbsp;Session<span style="font-family: 宋体">的</span>update()<span style="font-family: 宋体">、</span>saveOrUpdate()<span style="font-family: 宋体">和</span>lock()<span style="font-family: 宋体">方法使脱管对象转变为持久化对象。</span></p>
<p style="margin-left: 53.25pt" class="MsoNormal"><span style="font-family: 宋体">当一个持久化对象关联一个临时对象时，在允许级联保存的情况下，</span>Session<span style="font-family: 宋体">在清理缓存时会把这个临时对象也转变成持久化对象。</span>Hibernate<span style="font-family: 宋体">保证在同一个</span>Session<span style="font-family: 宋体">实例的缓存中，数据库表中的每条记录只对应唯一的持久化对象，也就是说在一个</span>Session<span style="font-family: 宋体">里</span>load/get<span style="font-family: 宋体">同一个</span>OID<span style="font-family: 宋体">得到</span> <span style="font-family: 宋体">的是相同的对象。</span></p>
<p style="margin-left: 10.5pt" class="MsoNormal"><strong><span style="font-size: 12pt">3-3</span></strong><strong><span style="font-family: 宋体; font-size: 12pt">：脱管状态</span></strong></p>
<p style="margin-left: 10.5pt" class="MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="font-family: 宋体">实例曾经与某个持久化上下文发生过关联，不过那个上下文被关闭了，或者这个实例是被序列化</span>(serialize)<span style="font-family: 宋体">到另外的进程。它拥有持久化标识，并且在数据库中可能存在一个对应的行。对于脱管状态的实例，</span>Hibernate<span style="font-family: 宋体">不保证任何持久化标识和</span>Java<span style="font-family: 宋体">标识的关系。</span></p>
<p style="margin-left: 10.5pt" class="MsoNormal"><span style="font-family: 宋体">脱管对象具有以下特征。</span></p>
<p style="text-indent: -21pt; margin-left: 74.25pt; tab-stops: list 74.25pt" class="MsoNormal">1）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">不再位于</span>Session<span style="font-family: 宋体">的缓存中，也可以说，脱管对象不被</span>Session<span style="font-family: 宋体">关联。</span></p>
<p style="text-indent: -21pt; margin-left: 74.25pt; tab-stops: list 74.25pt" class="MsoNormal">2）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">脱管对象是有持久化对象转变过来的，因此在数据库中可能还存在与它对应的记录</span>(<span style="font-family: 宋体">前提条件是没有其他程序删除了这条记录</span>)<span style="font-family: 宋体">。</span></p>
<p style="text-indent: -21pt; margin-left: 74.25pt; tab-stops: list 74.25pt" class="MsoNormal">3）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">脱管对象与临时对象的相同指出在于两者都不被</span>Session<span style="font-family: 宋体">关联，因此</span>Hibernate<span style="font-family: 宋体">不会保证他们属性变化与数据库保持同步。脱管对象与临时对象的区别在于前者是由持久化对象转变过来的，因此可能在书库中还存在对应的记录，而后者在数据库中是没有对应的记录的。</span></p>
<p style="margin-left: 53.25pt" class="MsoNormal">Session<span style="font-family: 宋体">的以下方法使持久化对象转变成脱管对象</span>.</p>
<p style="text-indent: -18pt; margin-left: 71.25pt; tab-stops: list 71.25pt" class="MsoNormal">1)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">当调用</span>Session<span style="font-family: 宋体">的</span>close()<span style="font-family: 宋体">方法时，</span>Session <span style="font-family: 宋体">的缓存被清空，缓存中的所有持久化对象都变为脱管对象，如果在应用程序中没有引用变量引用这些脱管对象，他们就会结束生命周期。</span></p>
<p style="text-indent: -18pt; margin-left: 71.25pt; tab-stops: list 71.25pt" class="MsoNormal">2)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Session<span style="font-family: 宋体">的</span>evict()<span style="font-family: 宋体">方法能够从缓存中删除一个持久化对象，使它变为脱管状态，当</span>Session<span style="font-family: 宋体">的缓存中保存了大量的持久化对象时，会消耗许多内存空间，为了提高性能，可以考虑调用</span>evict()<span style="font-family: 宋体">方法，从缓存中删除一些持久化对象。但是多数情况下不推荐使用该方法，而应该通过查询语言，或者显示的导航来控制对象图的深度。</span></p>
<p style="margin-left: 10.5pt" class="MsoNormal"><strong>&nbsp;</strong></p>
  <img src ="http://www.blogjava.net/absolutedo/aggbug/308863.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/absolutedo/" target="_blank">iowen</a> 2010-01-09 19:08 <a href="http://www.blogjava.net/absolutedo/archive/2010/01/09/308863.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>