2012-04-20 72 views
0

我有以下的域對象我如何使用hibernate中的子類來獲取表中的屬性?

Loan { 
    int id; 
    Date attribute1; 
} 

LoanExtension { 
    Date attribute2; 
} 

我想保持這樣我的對象,因爲有時我想改變只在LoanExtension屬性在我的數據庫(即ATTRIBUTE1在貸款對象將在空該對象,我不想讓它在數據庫中設置)。

這是如何使用Hibernate映射與XML?我已經做了以下

<class name="org.domain.borrowerReview.Loan" table="loan_profiles" > 
    <cache usage="read-only"/> 
    <id name="loanId" column="id"> 
     <generator class="native"/> 
    </id> 
    <version name="attribute1" column="date_1/> 
    <subclass name="org.domain.borrowerReview.LoanExtension" extends="org.rangde.domain.borrowerReview.LoanProfilesUpdate"> 
     <property name="attribute2" column="date_2" /> 
    </subclass> 
</class> 

我得到這個異常:當使用「單表每層次」需要 鑑別器和類有子類

+0

http://stackoverflow.com/a/175046/169277 – ant 2012-04-20 08:25:29

回答

0

簡短的回答

您需要添加鑑別器列並將片段更改爲像這樣的內容。

<class name="org.domain.borrowerReview.Loan" table="loan_profiles" > 
    <cache usage="read-only"/> 
    <id name="loanId" column="id"> 
     <generator class="native"/> 
    </id> 
    <version name="attribute1" column="date_1/> 
    <discriminator column="loan_profiles_type" type="string"/> 
    <subclass name="org.domain.borrowerReview.LoanExtension" extends="org.rangde.domain.borrowerReview.LoanProfilesUpdate"> 
     <property name="attribute2" column="date_2" /> 
    </subclass> 
</class> 

龍答案

首先,千萬記得在JPA繼承不是絕對平行於常規繼承。

必須評估類的設計將如何影響底層模式。

你還沒有提到你想如何擁有你的表結構。

Hibernate提供了三種繼承機制。每類層次

  • 每個子類表
  • 每個具體類表

見detaiils here

你的XML片段表明,你正在使用每類層次結構表。

現在,如果有一個子類,如果它只是一個子類(儘管它是允許的),那就沒什麼用處了。在「每個類的層次結構」下,所有子類都放在同一個表中。

爲了區分特定記錄屬於哪個子類,hibernate依賴於鑑別器列。

您需要定義相同的。

請參考以下文件documentation

+0

謝謝你的答案。是的,我使用每個類層次結構的表(即,子類和超類中的屬性在一個表中)。 我將添加更多的子類,因爲我在我的應用程序中用於更多目的的對象。 – 2012-04-21 07:11:08

相關問題