假设我们有两个数据库表Instructor
和Instructor_Details
。它们具有一对一的关系,因此每个讲师可以具有一个讲师详细信息,并且一个讲师详细信息仅与一个讲师相关联。
在纯数据库术语中,Instructor
表应该是Instructor_Details
表的父级,而Instructor
表的主键应该用作Instructor_Details
表中的外键。
我正在学习Hibernate,并且互联网上@OneToOne
的大多数示例都修改了表,使得Instructor_Details
主键用作Instructor
表中的外键,这似乎是矛盾的因为Instructor
应该是Instructor_Details
的父项。
如何以最佳方式实现两个实体,以便可以将Instructor
的主键用作Instructor_Details
中的外键。另外,请在我想要的实现中解释获取类型和级联。带有代码的示例将非常有帮助。
修改
让我们说一下表的属性如下:
讲师(讲师ID(主键),名字,姓氏
Instructor_Details(详细ID(主键),任务,地址,instructionor_id(教师表中的外键))
答案 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
的人永远不会知道里面有保存他们的列表。