1对1主键关键:
如身份证与用户信息,用户ID如果与身份证号码相同的话,那么就能保证用户与身份证的一 一对应关系了。
这里还是以用户与房间为便,当房间号参照用户ID时,那么就实现一 对一关系了。
关键在于如何保证主键相同
1.Customer1类:
public class Customer1 {
private int customerId;
private String customerName;
private Room1 room;
//略去get/set
}
Room1类:
public class Room1 {
private int roomId;
private String roomName;
private Customer1 customer;
//略去get/set
}
2.映射文件
Customer1.hbm.xml
<hibernate-mapping package="org.zengge.hibernate.onetoone.pojo">
<class name="Customer1" table="customer1">
<id name="customerId" type="int">
<generator class="native" />
</id>
<property name="customerName" type="string"/>
<one-to-one name="room" class="Room1"></one-to-one>
</class>
</hibernate-mapping>
这个映射文件没什么特别,引入了one-to-one标签,只是指定的相关属性与类
Room1.hbm.xml
<hibernate-mapping package="org.zengge.hibernate.onetoone.pojo">
<class name="Room1" table="room1">
<id name="roomId" type="integer">
<generator class="foreign">
<param name="property">customer</param>
<!-- 主键参考customer的主键作外键 -->
</generator>
</id>
<property name="roomName" type="string" ></property>
<one-to-one name="customer" class="Customer1" constrained="true"></one-to-one>
<!--
constrained(约束) (可选) 表明该类对应的数据库表,和被关联的对象所对应的数据库表之间,
通过一个外键引用对主键进行约束。 这个选项影响save()和delete()
在级联执行时的先后顺序以及 决定该关联能否被委托(也在schema export tool中被使用).
constrained意义:表room1的主键也是外键,外键引用customer的主键
相当于加了一个外键约束
-->
</class>
</hibernate-mapping>
generator类型为foreign,表明主键是参照另一表的主键作外键(既是主键又是外键),param标签用于指定相关联的类的属性名,这里的customer指的是Room1中的属性。
constrained:就是为主键加了一个外键约束,说明room1表的主键既是主键又是外键,这样就能保证customer1与room1中的主键一致,从而实现1对1映射。
3.测试
当不添加constrained=true时,导出表
结果为:
create table customer1 (customerId integer not null auto_increment, customerName varchar(255), primary key (customerId))
create table room1 (roomId integer not null, roomName varchar(255), primary key (roomId))
没有任何约束信息,这样不能保证两张表相关信息主键的一致性。
当添加constrained=true时,导出表
结果为:
create table customer1 (customerId integer not null auto_increment, customerName varchar(255), primary key (customerId))
create table room1 (roomId integer not null, roomName varchar(255), primary key (roomId))
alter table room1 add index FK67A9AB673EA242A (roomId), add constraint FK67A9AB673EA242A foreign key (roomId) references customer1 (customerId)
表room1表上添加了外键,引用的是customer1表中的主键
这样在添加信息时,就能保存一致性了。
保存:
注意,因为room1是引用了customer1的主键,那么只有产生了一个customer1的记录,才能供room1引用。
Session session = HibernateUtils.getSession();
Transaction tr = session.beginTransaction();
Room1 room = new Room1();
room.setRoomName("moon");
Customer1 customer = new Customer1();
customer.setCustomerName("sky");
//对于数据库中不存在的cusomer,必须先保存,只有保证了
//cusomer存在,才能存room,否则报错
room.setCustomer(customer);
session.save(customer);
session.save(room);
tr.commit();