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()); } }
注意点:一定要将控制权给多的一方