2017-02-03 64 views
2

我正在用Spring框架+ Hibernate開始一個web應用程序項目。我想在應用程序中爲兩種不同類型的用戶建模:醫生患者。他們有一些常見的屬性,如姓名,電子郵件,電話號碼等,但醫生有更具體的屬性,如合議號碼,專業,學習等。用Hibernate處理不同的用戶類型

這是一個無屬性簡化的E-R模型(Hibernate方法)。

enter image description here

正如你所看到的,關係會變成1比1,但其中一人將永遠是零。我也有關於使用繼承,但我從來沒有在Hibernate中使用它,所以我不知道哪個是最好的方法,爲什麼。哪種方法最簡單有效?

謝謝!

回答

1

@Inheritance方法只是在持久性上下文中共享兩個託管類型之間的公共屬性的一種方法。不要忘記@MappedSuperclass完全一樣,沒有任何層次意義上將兩種數據類型結合在一起。

需要考慮的一件事是,從域的角度來看,Doctor是否可以是Patient,如果是這樣,那麼從API角度打開的影響是什麼?

撥打#getPatientDiagnosis(Patient patient)並通過Doctor可以嗎?從代碼的角度來看,它編譯並且合乎邏輯,因爲你選擇了繼承,但從域的角度來看,這沒有任何意義。

這是我經常主張在域與持久模型中分離的原因之一。從數據存儲的數據模型角度來看,通常有設計決策是非常有意義的,但這些決策會在更高抽象層面上引入技術債務。

如果是我重複使用我的實體作爲我的域模型,我會選擇@MappedSuperclass,除非在這種情況下您有另一個令人信服的理由來使用繼承。

+0

感謝您的回答@納羅斯,我不知道'@ MappedSupperclass'註釋,但我認爲這不是我所需要的,因爲我正在使用一個用戶帳戶,它將存儲在會話中每個用戶,所以我想要的是用用戶帳戶ID檢索一個「患者」或「醫生」,所以我認爲這個解決方案不適合很好嗎? –

+0

你的圖告訴我一個'Account'由兩個可選的relatioships組成,一個'Doctor'和一個'Patient'。除此之外,如何解讀讀取這兩個屬性和分支是應用程序關心的問題,並不一定要在持久層中指定繼承的要求,除非您認爲您希望在表中對數據進行建模。 – Naros

+0

謝謝@Naros,我明白了。因此,哪種方法更好:1-可選的1對1關係並檢查「Account」是否具有非空的Patient或Doctor或2繼承(與相應的db表)並找到Patient或每當我需要時,由'Account'標識符提供一個'Doctor'? –

相關問題