hibernate映射之单项一对多

数据模型

表person

表room

 

实体对象模型

Personprivate int pid;
    private String pname;

 

Room private int rid;
    private String rname;
    private Set<Person> persons;

 

xml映射配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.skyedu.bean">
    <class name="Person" table="person">
       <id name="pid" column="pid" >
           <generator class="native"></generator>
       </id>
       <property name="pname" column="pname" length="32" ></property>
    </class>
</hibernate-mapping>

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.skyedu.bean">
    <class name="Room" table="room">
       <id name="rid" column="rid" >
             <generator class="native"></generator>
       </id>
       <property name="rname" column="rname" length="30"></property>
       <set name="persons" cascade="save-update" inverse="true">
         <key column="rid"></key>
         <one-to-many class="Person" />
       </set>
    </class>
</hibernate-mapping> 

 

测试:

 /*
  *Copyright 广东省深圳市动感蓝天教育  All Rights Reserved. 
  *Written by:weidan     2013-2-5 
  *QQ:956698821
  *Email:weidanhappy@sina.cn
  *Remark:This class is used to complete ......
  */
package com.skyedu.test;


import java.util.HashSet;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.skyedu.bean.Person;
import com.skyedu.bean.Room;
import com.skyedu.util.HibernateUtil;


public class TestHibernate {

    /**
     * @author weidan       2013-2-5 下午4:28:36
     * remark:没有控制反转之前
     * 添加执行的sql语句:
     * Hibernate: insert into room (rname) values (?)
     * Hibernate: insert into person (pname) values (?)
     * Hibernate: insert into person (pname) values (?)
     * Hibernate: update person set rid=? where pid=?
     * Hibernate: update person set rid=? where pid=?
     *  插入3条记录,执行了5条sql语句,说明效率并不是特别高,所以我们要尽量避免由一的一方来控制
     *
     */
    @Test
    public void testSave(){
        Session session = HibernateUtil.getSession();
        Transaction transaction = session.beginTransaction();
        try{
            Room room = new Room();
            room.setRname("水帘洞1");
            
            Person person1 = new Person();
            person1.setPname("猴子3");
            
            Person person2 = new Person();
            person2.setPname("猴子4");
            
            Set<Person> persons = new HashSet<Person>();
            persons.add(person1);
            persons.add(person2);
            room.setPersons(persons);
            
            session.save(room);
            
            transaction.commit();    
        }catch(Exception e){
            transaction.rollback();
        }finally{
            HibernateUtil.closeSession(session);
        }
    }
    
    
    /**
     * @author weidan       2013-2-5 下午4:33:22
     * remark: 控制反转,加了inverse="true"之后,控制权交给了person
     * Hibernate: insert into room (rname) values (?)
       Hibernate: insert into person (pname) values (?)
       Hibernate: insert into person (pname) values (?)
                      虽然只执行了三条sql语句,但是数据库数据并未关联起来
       
     */
    public void testSave1(){
        Session session = HibernateUtil.getSession();
        Transaction transaction = session.beginTransaction();
        try{
            Room room = new Room();
            room.setRname("水帘洞");
            
            Person person1 = new Person();
            person1.setPname("猴子1");
            
            Person person2 = new Person();
            person2.setPname("猴子2");
            
            Set<Person> persons = new HashSet<Person>();
            persons.add(person1);
            persons.add(person2);
            room.setPersons(persons);
            
            session.save(room);
            
            transaction.commit();    
        }catch(Exception e){
            transaction.rollback();
        }finally{
            HibernateUtil.closeSession(session);
        }
    }
    
    
    
    /**
     * @author weidan       2013-2-5 下午4:35:43
     * remark: 不论控制权在那一边,查询没有影响
     */
    @Test
    public void testFind(){
        Session session = HibernateUtil.getSession();
        Room room = (Room) session.get(Room.class, 2);
        System.out.println(room.getRname());  
        for(Person person:room.getPersons()){
            System.out.println("--"+person.getPname());
        }       
    }
    
    
}

注意点:当控制权在1的一方的时候效率会比较的第,新增多条条数据,会发出多条insert语句也update语句,所以相对来说效率会比较低,我们应该讲控制权交给多的一方,同时放弃1的一方的操作权

 

posted @ 2013-02-04 16:56  虎猫  阅读(181)  评论(0编辑  收藏  举报