Hibernate one-to-many学习笔记

EmylinkUpcode  1...................n  EmylinkUlink   一对多关系

1.hbm.xml描述
  EmylinkUpcode.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="hbm">
 <class name="EmylinkUpcode" table="emylink_upcode">
  <id
   name="id" type="integer" column="plink_code"
  >
   <generator class="org.hibernate.id.IncrementGenerator"/>
  </id>

  <property
   name="account"
   column="account"
   type="string"
   not-null="true"
   length="20"
  />
  <property
   name="plinkName"
   column="plink_name"
   type="string"
   not-null="true"
   length="50"
  />
  <property
   name="plinkExplain"
   column="plink_explain"
   type="string"
   not-null="false"
   length="100"
  />
  <property
   name="typeCode"
   column="type_code"
   type="string"
   not-null="false"
   length="8"
  />
 
  <set name="emylinkUlinks" inverse="true" lazy="true"  cascade="all"
       <key column="plink_code"/>
      <one-to-many class="EmylinkUlink"/>
  </set>

 </class> 
</hibernate-mapping>

None.gif 操作级联(cascade)关系。
None.gif可选值:
None.gifall : 所有情况下均进行级联操作。
None.gifnone:所有情况下均不进行级联操作。
None.gifsave
- update:在执行save - update时
None.gif进行级联操作。
None.gifdelete:在执行delete时进行级联操作。

 EmylinkUlink.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="hbm">
 <class
  name="EmylinkUlink"
  table="emylink_ulink"
 >
  <id
   name="id"
   type="integer"
   column="id"
  >
   <generator class="org.hibernate.id.IncrementGenerator"/>
  </id>

  <property
   name="account"
   column="account"
   type="string"
   not-null="true"
   length="20"
  />
  <property
   name="link"
   column="link"
   type="string"
   not-null="true"
   length="200"
  />
  <property
   name="linkName"
   column="link_name"
   type="string"
   not-null="true"
   length="20"
  />
  <property
   name="explain"
   column="explain"
   type="string"
   not-null="false"
   length="500"
  />
  <property
   name="indate"
   column="indate"
   type="date"
   not-null="true"
   length="16"
   insert="false"                //不参与插入操作
   update="false"             //不参与更新操作
  />
  <property
   name="sort"
   column="sort"
   type="string"
   not-null="false"
   length="3"
  />
  <property
   name="private"
   column="private"
   type="string"
   not-null="false"
   length="1"
  />
  <many-to-one
   name="plinkCode"
   column="plink_code"
   class="EmylinkUpcode"
   not-null="true"
  >
  </many-to-one>
 </class> 
</hibernate-mapping>


2.POJO对象
  EmylinkUpcode.java
None.gif //
None.gif    
//  primary key
None.gif
     private  java.lang.Integer id;
None.gif
None.gif    
//  fields
None.gif
     private  java.lang.String account;
None.gif    
private  java.lang.String plinkName;
None.gif    
private  java.lang.String plinkExplain;
None.gif    
private  java.lang.String typeCode;
None.gif
None.gif    
//  collections
None.gif
     private  java.util.Set < hbm.EmylinkUlink >  emylinkUlinks;
None.gif
None.gif
//

  EmylinkUlink.java
None.gif //
None.gif
private   int  hashCode  =  Integer.MIN_VALUE;
None.gif
None.gif    
//  primary key
None.gif
     private  java.lang.Integer id;
None.gif
None.gif    
//  fields
None.gif
     private  java.lang.String account;
None.gif    
private  java.lang.String link;
None.gif    
private  java.lang.String linkName;
None.gif    
private  java.lang.String explain;
None.gif    
private  java.util.Date indate;
None.gif    
private  java.lang.String sort;
None.gif    
private  java.lang.String m_private;
None.gif
None.gif    
//  many to one
None.gif
     private  hbm.EmylinkUpcode plinkCode;
None.gif
//

通过EmylinkUpcode加载EmylinkUlink( 注意EmylinkUpcode.hbm.xml中声明了延迟加载)
Session session  =  EmylinkSessionFactory.currentSession();
         Query q 
=  session.createQuery( " from EmylinkUpcode where account='derek' " );
                List l 
=  q.list();
               
                   EmylinkUpcode eu 
=   (EmylinkUpcode)l.get( 0 );
                   System.out.println(eu.getPlinkName());
                   
// Hibernate.initialize(eu.getEmylinkUlinks()); // 当延迟加载lazy=true时,强制加载及联对象
                   
                   Set ul 
=  eu.getEmylinkUlinks(); 
                                     
                   Iterator
< EmylinkUlink >  it  =  ul.iterator(); // lazy=true并且不使用强制加载,则此时才真真及联加载
                   
                   
while (it.hasNext()){
                    System.out.println(it.next().getLinkName());
                   }
 EmylinkSessionFactory.closeSession();  

* 延迟加载   
   如果lazy=true(延迟加载), 加载EmylinkUpcode时,hibernate不会立即加载EmylinkUlink,只有当(Iterator<EmylinkUlink> it = ul.iterator();)执行时,hibernate才加载EmylinkUlink实例; 如果在加载前就关闭session,则报异常LazyInitializationException ; 可以使用Hibernate.initialize(Object o)强制及联加载

*J2SE5.0的泛型

public   void  setEmylinkUlinks (java.util.Set < hbm.EmylinkUlink >  emylinkUlinks) {
        
this .emylinkUlinks  =  emylinkUlinks;
    }
Iterator < EmylinkUlink >  it  =  ul.iterator();                    
                   
while (it.hasNext()){
                    EmylinkUlink el 
=  it.next(); // 无需进行强制类型转换
                    System.out.println(el.getLinkName());
                   }

emylinkUlinks集合中只能存放EmylinkUlink对象,从集合中获取对象无需再类型转换
 
struts+spring+hibernate关于hibernate中lazy="true"的问题。web.xml中用   

           < filter >    
                  
< filter - name > openSessionInViewFilter </ filter - name >    
                  
< filter - class > org.springframework.orm.hibernate.support.OpenSessionInViewFilter </ filter - class >    
          
</ filter >    
    
          
< filter - mapping >    
                  
< filter - name > openSessionInViewFilter </ filter - name >    
                  
< url - pattern >* . do </ url - pattern >    
          
</ filter - mapping >

  它的原理就是:打开页面的时候打开session,一直到页面装载完毕才关闭session,这样就解决了lazy="true"时session   is   closed的问题。
  关于OpenSessionInViewFilter 延迟加载失效问题 http://www.iteye.com/topic/15057
          OpenSessionInView的效率问题  http://www.iteye.com/topic/17501

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值