2010-11-11 106 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本身可能会利用隐式多态性向您返回正确的结果。