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

浙公网安备 33010602011771号