繁体   English   中英

在Hibernate中一对一映射?

[英]One to one mapping in Hibernate?

假设我们有两个数据库表InstructorInstructor_Details 它们具有一对一的关系,因此每个讲师可以具有一个讲师详细信息,而一个讲师详细信息仅与一个讲师相关联。

在纯数据库而言, Instructor表应该是父Instructor_Details表的主键Instructor表应作为外键Instructor_Details表。

我正在学习Hibernate和大部分的例子@OneToOne互联网上已经修改使得表Instructor_Details主键被用作外键Instructor表,这似乎是矛盾的Instructor应该是父Instructor_Details

我如何能实现在这样,我可以使用的主键,最好的办法两个实体Instructor为外键Instructor_Details 另外,请在我想要的实现中解释获取类型和级联。 带有代码的示例将非常有帮助。

编辑

让我们说这些表的属性如下:

讲师(instructor_id(主键),名字,姓氏)

Instructor_Details(detail_id(主键),dob,地址,instructionor_id(教师表中的外键))

因为从纯数据库的角度来讲,您正在将其建模为父/子,所以您被OneToMany所困扰。 在这种情况下,我做了什么,所以我可以保持这种关系,并利用诸如级联删除之类的优势。在实体本身上具有辅助方法。 由于Hibernate使用反射,因此您实际上不需要为私有成员实现公共getter和setter。

因此,例如,您的InstructorDetails Instructor类的访问器可以如下所示:

public class Instructor {

    ...
    @OneToMany
    private List<InstructorDetails> instructorDetails;

    public Optional<InstructorDetails> getInstructorDetails() {
        if (instructorDetails == null || instructorDetails.size() == 0) {
            return Optional.empty();
        } else if (instructorDetails.size() > 1) {
            // Optional raise if you want to be aware of corrupt Instructors that have many details
            throw Exception("There's corrupt data");
        } else {
            return Optional.of(instructorDetails.get(0));
        }
    }

    ...
}

说得通? 与add相同...您可以有一个只包含单个详细信息的add,检查是否已经有一个add并且覆盖或抛出,但是在内部它处理列表。 Instructor打交道的人永远不会知道里面有保存他们的名单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM