返回介绍

基于外键

发布于 2025-01-04 01:27:28 字数 3222 浏览 0 评论 0 收藏 0

介绍

对于基于外键的 1-1 关联,外键可以存放在任意一边。需要存放外键的一端,需要增加 <many-to-one.../> 元素,并且为 <many-to-one.../> 元素增加 unique="true" 属性来表示该实体实际上是 1 的一端。 <many-to-one name="manager" class="Manager" column="MGR_ID" unique="true"></many-to-one>

对于 1-1 的关联关系,两个实体原本处于平等状态,但当我们选择任意一个表来增加外键后(增加 <many-to-one.../> 元素的实体端),该表即变成从表,而另一个表则成为主表。

另一端需要使用 <one-to-one.../> 元素,该 <one-to-one.../> 元素需要使用 name 属性指定关联属性名。为了让系统不再为本表增加一列,而是使用外键关联,使用 property-ref 属性指定引用关联类的属性。 <one-to-one name="department" class="Department" property-ref="manager"></one-to-one>

代码

实体类

public class Department {
    private Integer deptId;
    private String deptName;
    private Manager manager;
    //省去 get 和 set
}
public class Manager {
    private Integer mgrId;
    private String mgrName;
    private Department department;
    //省去 get 和 set
}

Manager.hbm.xml

<hibernate-mapping package="com.lihui.hibernate.double_1_1.foreign">
    <class name="Manager" table="MANAGERS">
        <id name="mgrId" type="java.lang.Integer">
            <column name="MGR_ID" />
            <generator class="native" />
        </id>
        <property name="mgrName" type="java.lang.String">
            <column name="MGR_NAME" />
        </property>
        <!-- 映射 1-1 的关联关系,在对应的数据表中已经有外键,当前持久花类使用 ont-to-one 进行映射 -->
        <one-to-one name="department" class="Department" property-ref="manager"></one-to-one>
    </class>
</hibernate-mapping>

Department.hbm.xml

<hibernate-mapping package="com.lihui.hibernate.double_1_1.foreign">
    <class name="Department" table="DEPARTMENTS">
        <id name="deptId" type="java.lang.Integer">
            <column name="DEPT_ID" />
            <generator class="native" />
        </id>
        <property name="deptName" type="java.lang.String">
            <column name="DEPT_NAME" />
        </property>
        <many-to-one name="manager" class="Manager" column="MGR_ID" unique="true"></many-to-one>
    </class>
</hibernate-mapping>

测试

@Test
    public void testGet(){
        Department dep = (Department) session.get(Department.class, 1);
        System.out.println(dep.getDeptName());
        Manager mgr =dep.getManager();
        System.out.println(mgr.getMgrName());
    }
    @Test
    public void testSave() {
        Department dep = new Department();
        dep.setDeptName("a");
        Manager mgr = new Manager();
        mgr.setMgrName("b");
        dep.setManager(mgr);
        mgr.setDepartment(dep);
        session.save(mgr);
        session.save(dep);
    }

Notice

上面的映射策略可以互换,即让 Manager 存放外键,使用 <many-to-one.../> 元素映射关联属性;但 Department 端则必须使用 <one-to-one.../> 元素映射,万万不可两边都使用相同的元素映射关联属性。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文