在Hibernate中一对一映射?

时间:2018-10-10 21:57:49

标签: java hibernate jpa orm

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

在纯数据库术语中,Instructor表应该是Instructor_Details表的父级,而Instructor表的主键应该用作Instructor_Details表中的外键。

我正在学习Hibernate,并且互联网上@OneToOne的大多数示例都修改了表,使得Instructor_Details主键用作Instructor表中的外键,这似乎是矛盾的因为Instructor应该是Instructor_Details的父项。

如何以最佳方式实现两个实体,以便可以将Instructor的主键用作Instructor_Details中的外键。另外,请在我想要的实现中解释获取类型和级联。带有代码的示例将非常有帮助。

修改

让我们说一下表的属性如下:

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

Instructor_Details(详细ID(主键),任务,地址,instructionor_id(教师表中的外键))

1 个答案:

答案 0 :(得分:-2)

由于使用纯数据库术语,您将其建模为父级/子级,因此无法使用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的人永远不会知道里面有保存他们的列表。