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的一方的操作权