通过共享主键映射

  • 举例,用户和地址的一对一关系。用共享主键来关联的话,就是两张表的主键之一作为外键,关系限定为一对一。

    //用户类(包含地址)
    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>
    
    • 数据库

      代码实例

      HibernateOneToOne