`
envoydada
  • 浏览: 64878 次
社区版块
存档分类
最新评论

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>

操作级联(cascade)关系。
可选值:
all : 所有情况下均进行级联操作。
none:所有情况下均不进行级联操作。
save
-update:在执行save-update时
进行级联操作。
delete:在执行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
//
    
// primary key
    private java.lang.Integer id;

    
// fields
    private java.lang.String account;
    
private java.lang.String plinkName;
    
private java.lang.String plinkExplain;
    
private java.lang.String typeCode;

    
// collections
    private java.util.Set<hbm.EmylinkUlink> emylinkUlinks;

//

  EmylinkUlink.java
//
private int hashCode = Integer.MIN_VALUE;

    
// primary key
    private java.lang.Integer id;

    
// fields
    private java.lang.String account;
    
private java.lang.String link;
    
private java.lang.String linkName;
    
private java.lang.String explain;
    
private java.util.Date indate;
    
private java.lang.String sort;
    
private java.lang.String m_private;

    
// many to one
    private hbm.EmylinkUpcode plinkCode;
//

通过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

分享到:
评论

相关推荐

    hibernate 学习笔记小结

    ### Hibernate学习笔记小结 #### 一、简介与配置 **Hibernate** 是一款开源的对象关系映射(ORM)框架,它允许开发人员将Java对象自动持久化到数据库表中,从而简化了数据访问层的开发工作。在Spring框架中,...

    hibernate学习笔记文档

    - 在 XML 映射文件中使用 `&lt;one-to-many&gt;` 或 `&lt;many-to-many&gt;` 标签来配置这些关系。 - **查询操作**: - 使用 HQL(Hibernate Query Language)或 Criteria API 来执行复杂查询。 - 支持分页查询、动态查询等...

    Hibernate学习笔记

    【Hibernate学习笔记】 在深入探讨Hibernate之前,先要理解什么是持久化对象的状态。持久化对象在Hibernate中有三种状态:瞬时(Transient)、持久化(Persistent)和离线(Detached)。瞬时对象是指通过`new`操作...

    达内HIBERNATE学习笔记

    - `&lt;one-to-one&gt;`、`&lt;one-to-many&gt;`、`&lt;many-to-many&gt;`:表示关联关系的映射。 #### 2.3 id的内置生成器 - **常见生成器**: - `increment`:每次生成一个递增的值。 - `identity`:由数据库自动生成唯一标识符...

    Hibernate学习笔记_songjignhao_1

    在 Hibernate 映射文件中,我们使用 `&lt;set&gt;` 标签来定义集合关系,`&lt;one-to-many&gt;` 标签表示从 Customer 到 Order 的关系,而 `&lt;many-to-one&gt;` 标签则表示从 Order 到 Customer 的关系。注意设置 cascade 参数以处理...

    Hibernate学习笔记,使用Hibernate做数据层非常方便

    【Hibernate学习笔记,使用Hibernate做数据层非常方便】 在Java开发中,Hibernate是一个非常流行的ORM(Object-Relational Mapping)框架,它简化了数据库操作,将数据库中的表映射为Java对象,使得开发者可以像...

    hibernate 学习笔记3

    &lt;one-to-many class="Account"/&gt; ``` 此段配置中,`acts`字段用于表示PO1实体中包含的PO2集合。`cascade`属性被设定为`all-delete-orphan`,意味着当PO1被删除或修改时,其关联的所有PO2也将被相应处理。`inverse...

    Hibernate笔记

    &lt;many-to-one name="classes" column="classesid" fetch="select"/&gt; ``` - **Fetch="join"**: 指定使用`JOIN FETCH`策略,即在加载主对象的同时,通过`JOIN`语句一次性加载关联对象。这可以减少数据库查询次数,但...

    Hibernate知识文档 知识点笔记纪要

    在多对一关联中,多个实体实例对应一个实例,通过`&lt;many-to-one&gt;`标签在多方定义外键,指向一方。级联操作允许对关联对象执行连锁操作,比如保存或删除。 六、一对一主键关联映射 一对一主键关联是指两个实体共享同...

    hibenate笔记

    常见的映射标签包括`&lt;class&gt;`、`&lt;id&gt;`、`&lt;property&gt;`、`&lt;one-to-one&gt;`、`&lt;many-to-one&gt;`、`&lt;one-to-many&gt;`和`&lt;many-to-many&gt;`等。每个标签都有其特定的属性,如`name`、`column`、`generator`等,用于指定字段名称、...

    hibernate学习课件

    2. 一对多(One-to-Many): 一个实体可以关联多个其他实体,如教师与学生。 3. 多对一(Many-to-One): 多个实体关联一个其他实体,如学生与班级。 4. 多对多(Many-to-Many): 多个实体可以关联多个其他实体,如...

    Hibernate学习笔记.doc

    通过&lt;many-to-one&gt;标签,多的一端在数据库中添加外键,指向一的一端。cascade属性用于指定级联操作,如all表示在操作多端对象时,同时影响一端对象。 最后,在第五个项目中,我们学习了一对一主键关联映射,通过...

Global site tag (gtag.js) - Google Analytics