Hibernate继承注释说明

时间:2010-11-11 13:31:13

标签: java 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'。

在这里吃大脑的是'条件'是CCSReleaseCandidates的成员而不是CCSRequestGroup,那么我们如何能够成功获得CCSRequestGroup实例的条件成员。

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

我想如果你打开SQL日志,你会发现你认为简单的语句实际上是在幕后与子类表进行外连接。这就是Hibernate可以获得数据的原因,而HQL本身可能正在利用隐式多态来向您返回正确的结果。