Hibernate对自联接的奇怪行为

时间:2016-07-27 11:50:28

标签: java hibernate join

我在Hibernate 4.3.5和4.3.11中看到一个奇怪的行为,其中我有一个带有自联接的表,这里也加载了其他对象是我的类

@Entity(name = "site")
@Table(name = "site")
public class Site implements Serializable
{  
    @OneToMany(mappedBy = "site", fetch = FetchType.EAGER)
    private List<SiteAttribute> siteAttributes;

    @Id
    @GeneratedValue
    @Column(name = "site_id")
    private Integer siteID;

    @OneToMany(mappedBy = "site", fetch = FetchType.EAGER)
    private List<ContainerPage> containerPages;    

    @OneToMany(mappedBy = "site", fetch = FetchType.EAGER)
    private List<UserTitle> userTitleList;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "parent_site_id")
    private Site parentSite;
}

使用parent_site_id作为自联接的表,每个站点可以有多个子站点。

检索Site对象的代码是:

Query q = session.createQuery("from site where site_id=:siteID");
q.setParameter("siteID", currentSiteID.intValue());
s = (Site) q.uniqueResult();

当我从休眠打开日志时,执行的查询如下所示:

select ...
from site site0_ 
left outer join containers_pages containerp2_ on site0_.site_id=containerp2_.site_id 
left outer join containers container3_ on containerp2_.container_id=container3_.container_id 
left outer join pages page4_ on containerp2_.page_id=page4_.page_id 
left outer join widgets_containers widgetcont5_ on containerp2_.container_page_id=widgetcont5_.container_page_id 
left outer join site site6_ on site0_.parent_site_id=site6_.site_id 
left outer join site_attribute siteattrib7_ on site6_.site_id=siteattrib7_.site_id 
left outer join user_title usertitlel10_ on site6_.site_id=usertitlel10_.site_id where site0_.site_id=?

从我们使用父hibernate进行网站左连接的那一刻起停止使用我的site0_.site_id并使用site6.site_id。这种行为是否正确?

看起来它缺少当前对象的信息,这个选择将返回比它应该更多的结果。

我的实施有问题,还是我需要获取网站并执行另一个查询来检索父网站?

0 个答案:

没有答案