簡體   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