通过共享主键映射
举例,用户和地址的一对一关系。用共享主键来关联的话,就是两张表的主键之一作为外键,关系限定为一对一。
//用户类(包含地址) public class User { private int id; private String name; private Address address; } //地址类(包含用户) public class Address { private int id; private String address; private String zipcode; //邮编 private User user; } //用户映射文件 <class name="User" table="t_user"> <id name="id" column="userId"> <generator class="native"></generator> </id> <property name="name" column="UserName"></property> <!--可以去掉,但每次获取到的user对象将不带其对应address--> <one-to-one name="address" class="com.java1234.model.Address" cascade="all"></one-to-one> <!--all:级联删除、更新都有了--> </class> //地址映射文件 <class name="Address" table="t_address"> <!-- 主键也作为外键与user属性关联 --> <id name="id" column="addressId"> <generator class="foreign"> <!--addressId作为外键关联userId--> <param name="property">user</param> <!--关联user属性--> </generator> </id> <property name="address" column="address"></property> <property name="zipcode" column="zipcode"></property> <!--可以去掉,两张表已然有关联,但获取address不带其对应user--> <one-to-one name="user" class="com.java1234.model.User" constrained="true"></one-to-one> <!--constrained:共享主键--> </class>
在用户表中添加一个外键与地址表相关联,并且将外键设置为唯一外键,相当于一对一的效果
//用户类和地址类同上 //用户表增加外键 <!--一对多外键,但是加了unique(不允许重复)之后又变成一对一--> <many-to-one name="address" class="com.java1234.model.Address2" column="addressId" cascade="all" unique="true"></many-to-one> <!--all:级联删除、更新都有了--> //地址映射文件说明一对一关系 <class name="Address2" table="t_address2"> <!-- 主键也作为外键与user属性关联 --> <id name="id" column="addressId"> <generator class="native"></generator> </id> <property name="address" column="address"></property> <property name="zipcode" column="zipcode"></property> <!-- user属性与User2类的address属性一对一 --> <one-to-one name="user" class="com.java1234.model.User2" property-ref="address"></one-to-one> <!--constrained:共享主键--> </class>