<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>hapuer</title>
    <description></description>
    <link>http://hapuer.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>关于延迟初始化所引发的问题</title>
        <author>hapuer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hapuer.javaeye.com">hapuer</a>&nbsp;
          链接：<a href="http://hapuer.javaeye.com/blog/195553" style="color:red;">http://hapuer.javaeye.com/blog/195553</a>&nbsp;
          发表时间: 2008年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这么长时间没有更新我的博客了，今天来更新一下吧！ 最近在做SSH学习的时候，总是出现 session 关闭 或者 proxy 无法初始化的问题。其实有两个场景，第一、当我在渲染页面的时候，这个页面里的元素要加载一个对象的子元素，这个时候就出现session关闭的问题，具体的问题我这里就不贴出来了，我想很多人都会遇到这样的问题。另一个场景，就是当我在用spring的测试框架的时候测试dao的时候，也出现的这样的问题，声明：我使用抽象类是AbstractDependencyInjectionSpringContextTests,因此JUnit老是红色，也出现<br /><br /><pre name="code" class="java"> org.hibernate.LazyInitializationException: could not initialize  proxy - no Session</pre><br /><br />  <br />   觉得很郁闷，在网上找了很多的资料，有几个关键词，那就是OpenSessionInView和 FlushModel，Transaction 最为多见。而究竟是什么问题，为什么会出现这样的情况，我想正如很多解决方案一样，必须深入到源码中去，必须知道session，Transaction，机制。才能充分的认识这个问题，并解决问题。要很好的解决这些问题，我参考了如下资料：<br /><br />1、<div class="quote_title">引用</div><div class="quote_div">http://www.javaeye.com/topic/11190</div><br />2、<div class="quote_title">引用</div><div class="quote_div">http://www.javaeye.com/topic/32001</div><br />3、<div class="quote_title">引用</div><div class="quote_div">http://www.javaeye.com/topic/15057</div><br /><br />这些真的很不错，在此谢谢了。
          <br/><br/>
          <span style="color:red;">
            <a href="http://hapuer.javaeye.com/blog/195553#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 22 May 2008 11:09:13 +0800</pubDate>
        <link>http://hapuer.javaeye.com/blog/195553</link>
        <guid>http://hapuer.javaeye.com/blog/195553</guid>
      </item>
      <item>
        <title>时间日期操作笔记</title>
        <author>hapuer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hapuer.javaeye.com">hapuer</a>&nbsp;
          链接：<a href="http://hapuer.javaeye.com/blog/131615" style="color:red;">http://hapuer.javaeye.com/blog/131615</a>&nbsp;
          发表时间: 2007年10月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          关于日期的处理：<br />一般涉及到<br />date,<br />calendar,<br />GregorianCalendar<br /><br />同时涉及到数据库操作中还有<br />Timestamp.<br />DateFormat;<br />SimpleDateFormat;<br /><br />一般要把一个时间字符串解析成自己想要的字符串来显示的话都是使用<br />SimpleDateFormat()类。<br /><br />SimpleDateFormat sdf = new SimpleDateFormat("自己想要的格式");<br />然后：String str = sdf.format(Date类型的对象);<br /><br />这个时候的str就是所要求的字符串；另外在操作数据库的时候，都是使用的Timestamp格式；从数据库中<br /><br />取得和插入的都是这样一个对象；因此必须将它转换成一个日期格式或者将一般的日期格式转换成这种类<br /><br />型：<br />   <br /> 这个类中一个getTime()方法，可以得到一个long型数据，然后在使用 new Date(long (object))这样就<br /><br />可以得到一个Date对象；<br /><br /> 而关于一般字符串向Timestamp类型转换，就需要使用到上面的SimpleDateFormat对象，来告诉它究竟按<br /><br />照一个什么样的规范来转换，然后使用parse("str")来得到一个date对象，再使用sdf.format()<br /><br />例如： <br /> <br />   String  dateStr = "1999-8-9 00:00:00";<br />   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");<br />   Date dt = sdf.parse(dateStr);<br />   Timestamp ts = Timestamp.valueOf(sdf.format(dt));
          <br/><br/>
          <span style="color:red;">
            <a href="http://hapuer.javaeye.com/blog/131615#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 13 Oct 2007 09:37:32 +0800</pubDate>
        <link>http://hapuer.javaeye.com/blog/131615</link>
        <guid>http://hapuer.javaeye.com/blog/131615</guid>
      </item>
      <item>
        <title>HIbernate实体关系映射笔记</title>
        <author>hapuer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hapuer.javaeye.com">hapuer</a>&nbsp;
          链接：<a href="http://hapuer.javaeye.com/blog/131273" style="color:red;">http://hapuer.javaeye.com/blog/131273</a>&nbsp;
          发表时间: 2007年10月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          实体关联映射：<br /><br />1、一对一映射：<br />   主要有两种方式来映射：<br />   一、基于外键的映射方式：<br />       首先有两张表，例如：TABEL user  AND card；card 表中参照一个user的主键id<br />       首先就是要保证这两个类中，必须要分别有各自的一个连接；也就是说在各个类中有另外一个类  <br /><br />     的一个属性；比如说：<br /> 	class User<br /> 	{<br />	   private Card card;//card的一个属性 <br /> 	}<br /> 	class Card<br />	{<br /> 	   private User user;//user的一个属性<br />	}<br />       这个时候配置就是在user的配置文件中；<br />       &lt;one-to-one name="card" class="" cascade="save-update" property-ref="user"/><br />           注意这里的property-ref属性：它是指在映射中，user找到card是通过user这样一个属性来  <br /><br />      找到的，如果不这样设置，那么就会在关联中出现user的id和card的id相关联的情况；<br />       而在card的配置文件中；<br />       &lt;many-to-one name="user" class="" column="userid" unique="true"><br />           注意这里column指如何找到user呢？是通过在表中的userid来找到的。而这里的unique指的  <br /><br />        是限制为了一对一<br />    二、基于主键的约束<br />        这里仍然有两张表，这两张表分别是：user 和 card 而这个时候，在card表中，并没有userid  <br /><br />      这一列，但是还是有一个参照userid的外键约束,这里的card中的id主要就是参照的是user中的id<br />        而上面基本上没有什么改变。只是在配置文件中；<br />        在user的配置文件中，<br />          &lt;one-to-one name="card" class="" cascade="save-update"/><br />         这里不需要配置property-ref属性 <br />        在card中<br />         &lt;one-to-one name="user" class="" constrainted="true"/><br />         另外在主键中也要改；开始的时<br />            &lt;id name="" type=""><br />               &lt;column name=""/><br />               &lt;generator class="native"/><br />            &lt;/id><br />         这里应该改为：<br />             &lt;id name="" type=""><br />               &lt;column name=""/><br />               &lt;generator class="foreign"><br />                    &lt;param name="property">user&lt;/param><br />                &lt;/generator><br />            &lt;/id><br /><br />2、一对多、多对一、以及双向多对一关联关系；<br />    <br />    首先讨论多对一的单向关联：这里有两张表；分别是email和user表；email为多的一方，而user为一 <br /><br />   的一方，<br />    email：id,emailname,uid;<br />    user:  uid, uname<br />    有持久化类：User 和 Email<br />    这里所谓单向就是说查询email表可以查出这个email是属于谁的，但是只查询user表不知道有多少个 <br /><br />   email；<br />     因此在持久化类中在多的一方，有一个一的一方的对象的属性；而在一的一方没有这方面的信息；<br />    所以在配置的时候就只在多的一方（email）中配置<br />    &lt;many-to-one name="user" class="" column="uid"/>这样就够了；但是这个时候在持久化的时候需 <br /><br />   要都调用save方法，这个时候还要加个级联属性：cascade=“all（save-update）”，那么这个时候  <br /><br />  只需要持久化这个email对象就够了，而不需要持久化user了。同时还有一个属性就是：outer-join    <br /><br />；这个属性是指在查询的时候是否使用外连接；如果不使用，那么查询的时候就会查询两次；<br />    <br />    另外，再讨论一下一对多的单向关联：<br />    从一的一方看，这就是一对多的关系，表同上，只是在持久化中就有点区别了，这里在User中有个包 <br /><br />    含set集合的属性，而在email中没有任何的设置，先前的user属性也不需要了，因为这是单向的影射 <br /><br />   ，所以不需要这样的设置。而在映射文件中就只在uses一方设计就好了。<br />    &lt;set name="emails" table="email"><br />      &lt;key column="uid">&lt;/key>  //这里的key是在email表中参照user表的外键<br />      &lt;one-to-many class="Email"> //这里的class肯定是填的是many这一方的类名<br />    &lt;/set><br />   <br />    最后再说一下多对一双向关联，只要把两边都加上，能让你找到我，让我找到你的话就可以了。<br /><br />3、多对多关联(比较典型的就是权限设计的时候)<br />   在做多对多关联映射的时候，都会有一张关联表；<br />   第一、单向多对多 <br />   第二、双向多对多<br />   单向多对多跟双向多对多本身没有多大的区别，只是必须有一边来维护他们之间的关系；<br />   比如说：有两张表；user 和 power表<br />   要建立它们的多对多的影射关系，那么这里必须在数据库中再建立一张表(连接表)user_power<br />   那么在持久化类中设置一个属性--set。那么需要在映射文件中配置这个set的映射<br />   &lt;set name="" table="关联表名"><br />      &lt;key column="">&lt;/key><br />      &lt;many-to-many class="" column=""><br />   &lt;/set><br />   下面来解释一下中间属性的作用；<br />    A: name:这里就是配置在所在持久化类中的set属性名<br />    B：table：这里就是关联表名，因为它们的关系就是靠这张关联表来维护<br />    C：column：这里设置的是在关联表中，与持久化类所在表的关联字段<br />    D：class：这里的many端，也就是name所对应的类；<br />    E：第二个col
          <br/><br/>
          <span style="color:red;">
            <a href="http://hapuer.javaeye.com/blog/131273#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 12 Oct 2007 09:47:24 +0800</pubDate>
        <link>http://hapuer.javaeye.com/blog/131273</link>
        <guid>http://hapuer.javaeye.com/blog/131273</guid>
      </item>
  </channel>
</rss>