2016-10-26 132 views
2

我有這種情況在Hibernate中有兩個類之間的父子關係,但在數據庫中沒有這種關係,因爲子類表示一個查看,而不是表格。休眠@Inheritance與表作爲父母和作爲子視圖

現在,問題是Hibernate很高興需要提供Inheritance annotation,否則Hibernate會考慮一些默認值並嘗試尋找一個不存在的「dtype」列。

我試圖使用TABLE_PER_CLASS作爲策略(默認值是SINGLE_TABLE),但在這種情況下,Hibernate做了一些與子類關聯的視圖的聯合,這在這裏沒有意義,並且有些錯誤引發了一個不存在的列 - 一個存在於表和視圖中的列,但任何方式。

問題在於如何根據註釋對此進行正確建模,或者如何在不產生涉及子級的基礎查詢的情況下詢問父實體。 (第二個問題是問here我沒有給一個嘗試但因爲我希望有一個更好的解決方案。)

編輯:更好的說明解釋,這裏是一段代碼相當於給我的設置:

@Entity 
@Table(name = "PARENT") 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class ParentEntity implements Serializable { 
    // ... 
} 

@Entity 
@Table(name = "PARENT_VIEW") 
public class ChildEntity extends ParentEntity implements Serializable { 
    // ... 
} 
+0

某些代碼可能會有所幫助。 –

+0

我已經包含了一些代碼來簡化閱讀;) – DanielM

+0

如果'ChildEntity'是唯一的子類,並且*將永遠擁有*,那麼可以沿着'SELECT p FROM ParentEntity p WHERE TYPE(p)< > ChildEntity'。否則,我不相信如果沒有'@ MappedSuperclass'解決方案就無法做到這一點。 –

回答

0

我無法理解建模。爲什麼這樣做?

如果'孩子'是'父'表上的一個視圖,那麼它不是一個真正的孩子,不應該像一個模型。

即使視圖是可修改的(例如,插入插入到'父母'表等),這基本上只是做自己的休眠會爲你做的(如在'孩子'的查詢將有效產生「父」元素的子集)。

你想用這種視圖結構來實現什麼?爲什麼它決定你需要用這種方式來建模?

在我看來,解決方案不是將它建模爲父子關係或使用single_table的繼承類型,並從子項中刪除表註釋(在休眠中使用正常的父子關係)。