hibernate映射之外键一对多双向(多对一双向)

数据模型

person表

room表

 

实体对象模型

Personprivate static final long serialVersionUID = 1L;
    private int pid;
    private String pname;
    private Room room;
Roomprivate static final long serialVersionUID = 1L;
    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>
       <many-to-one name="room" column="rid" class="Room" cascade="save-update" >
       </many-to-one>
    </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> 

 

测试

    
    
    
    /**
     * @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");
            person1.setRoom(room);
            
            Person person2 = new Person();
            person2.setPname("猴子2");
            person2.setRoom(room);
            
            session.save(person1);
            session.save(person2);
            
            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,4);
        System.out.println(room.getRname());  
        for(Person person:room.getPersons()){
            System.out.println("--"+person.getPname());
        }       
    }
    
    

注意点:一定要将控制权给多的一方

 

posted @ 2013-02-04 17:19  虎猫  阅读(248)  评论(0编辑  收藏  举报