Hibernate关系映射(N--1和 1--N)多对一和一对多
注意 :尽量使用多对一,一对多关系效率有些慢
(1)N--1(单向N--1外键映射) 只要是外键,就会牵扯到多对一的关系
第一步:类、对象之间的关系映射
public class Room {
privateintid;
privateStringroomName;
}public class User {
privateintid;
privateStringtruename;
private Room room;}
第二步:xml之间的映射
<class name="Room" table="t_room">
<idname="id"column="room_id">
<generatorclass="native"></generator>
</id>
<propertyname="roomName"unique="true"not-null="true"column="room_name"length="32"/>
</class><class name="User" table="t_user">
<idname="id"column="id">
<generatorclass="native"></generator>
</id>
<propertyname="truename"unique="true"not-null="true"column="truename"length="32"/>
<many-to-one name="room" not-null="true" class="Room" column="room_id" --外键cascade="save-update"> --保存修改级联
</many-to-one> </class>
第三步:创建对象
Room room = new Room();
room.setRoomName("听雨轩");
Useru1=newUser();
u1.setTruename("张三");
u1.setRoom(room);
Useru2=newUser();
u2.setTruename("李四");
u2.setRoom(room);
session.save(u1);
session.save(u2);第四步:查询
User user= (User )session.load(User .class, 1);
Room room = user.getRoom();
System.out.println(user.getTruename());
System.out.println(room .getRoomName());
(2)N--1(双向N--1) 数据库和(1)中的相同
第一步:类、对象之间的关系映射
public class Room {
privateintid;
private String roomName;private Set<User> users; // 增加了user集合 但是数据库没有变化}
public class User {
privateintid;
privateStringtruename;
private Room room;}
第二步:xml之间的映射
<class name="User" table="t_user">
<idname="id"column="id">
<generatorclass="native">
</generator>
</id>
<propertyname="truename"unique="true"not-null="true"column="truename"length="32"/>
<many-to-one name="room" not-null="true" class="Room" column="room_id"cascade="save-update"></many-to-one> </class>
<class name="Room" table="t_room">
<idname="id"column="room_id">
<generatorclass="native"></generator>
</id>
propertyname="roomName"unique="true"not-null="true"column="room_name"length="32"/>
--增加了set的配置
<setname="users">
<keycolumn="room_id"></key>--参考user中room_id字段
<one-to-manyclass="User"/>
</set>
</class>第三步:创建对象 和(1)中的一致
Room room = new Room();
room.setRoomName("听雨轩");
Useru1=newUser();
u1.setTruename("张三");
u1.setRoom(room);
Useru2=newUser();
u2.setTruename("李四");
u2.setRoom(room);
session.save(u1);
session.save(u2);第四步:查询
Room room = (Room)session.load(Room.class, 1);
System.out.println(room.getRoomName());
Set<User>users=room.getUsers();
for(Useruser:users){
System.out.println(user.getTruename());
}(3)1--N(单向一对多映射) 数据库中表的设计和(2)中表设计一致
第一步:对象关系的映射
public class Room {
privateintid;
privateStringroomName;
private Set<User> users; // 1的一端,加上多的引用}
public class User {
privateintid;
privateStringtruename;//没有对1的一端的引用
}第二步:xml的配置
<class name="User" table="t_user">
<idname="id"column="id">
<generatorclass="native">
</generator>
</id>
<property name="truename" unique="true" not-null="true" column="truename" length="32"/></class>
<class name="Room" table="t_room">
<idname="id"column="room_id">
<generatorclass="native"></generator>
</id>
<propertyname="roomName"unique="true"not-null="true"column="room_name"length="32"/>
<set name="users" cascade="save-update"inverse="true"> ---反转,将主控关系交给对方来管理 (默认是false,代表由本身来维护)
<keycolumn="room_id"></key>
<one-to-manyclass="User"/>
</set>
</class>在N--1或者1--N双向关系维护(创建对象时候),强制交给多的一方进行维护,不让1的一方维护,这样能提高效率 , 减少了n条update语句,但是,在查询的时候, 在1的一方就不能查询关联数据了
注意 :尽量使用多对一,一对多关系效率有些慢