我在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。这种行为是否正确?
看起来它缺少当前对象的信息,这个选择将返回比它应该更多的结果。
我的实施有问题,还是我需要获取网站并执行另一个查询来检索父网站?