2010-11-11 112 views
2

在我們的遺留代碼中,我偶然發現了一個我無法完全理解的hibernate類實現。Hibernate繼承註釋說明

有對應表WORK_REQUEST_GROUPS一個超類 -

@Entity 
@Table(name="WORK_REQUEST_GROUPS") 
@Inheritance(strategy=InheritanceType.JOINED) 
public class CCSRequestGroup 
{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="REQUEST_GROUP_ID") 
    private Long groupId; 
    .... 
} 

然後我們有對應表RELEASE_CANDIDATES一個子類 -

@Entity 
@Table(name="RELEASE_CANDIDATES") 
@PrimaryKeyJoinColumn(name="RELEASE_CANDIDATE_ID") 
public class CCSReleaseCandidate extends CCSRequestGroup { 

@ManyToOne 
@JoinColumn(name="GROUP_CONDITION_CODE") 
private CCSRequestGroupCondition condition; 
.... 
} 

根據我的理解它指出CCSReleaseCandidates是子類的CCSRequestGroup,並加入RELEASE_CANDIDATES_ID列。

現在我們有一個方法,我們嘗試找出CCSRequestGroup的情況下,一些標準 -

List<CCSRequestGroup> requests = session.createQuery("from CCSRequestGroup requestGroup where requestGroup.condition = \'AwaitingStartTime\' order by RAND()").list(); 

這可能是試圖找出其中有自己的病情目前的Hibernate會話的所有CCSRequestGroups ='AwaitingStartTime'。

這裏吃什麼我的大腦是'condition'是CCSReleaseCandidates而不是CCSRequestGroup的成員,那麼我們如何能夠成功地獲得CCSRequestGroup實例的條件成員。

有人可以幫我嗎?

+1

爲了贏得聲望,並讓其他人回答你的問題,接受你的問題的良好答案。 – 2010-11-24 14:44:53

回答

0

我想如果你打開SQL日誌記錄,你會發現你認爲是一個簡單的聲明實際上是在後臺使用子類表進行外連接。這就是爲什麼數據可用於Hibernate,並且HQL本身可能會利用隱式多態性向您返回正確的結果。