我有以下设置
Seizure {
private SeizureI18n seizureI18n;
@OneToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
public SeizureI18n getSeizureI18n() {
return this.seizureI18n;
}
}
SeizureI18n {
private Seizure seizure;
@OneToOne(fetch = FetchType.LAZY, mappedBy = "seizureI18n")
public Seizure getSeizure() {
return this.seizure;
}
}
当我使用以下Criteria
查询发出查询时(观察别名的使用情况)
criteria = metaDataConsole.session.createCriteria(Seizure.class,"Seizure");
criteria.createCriteria("Seizure.seizureI18n");
criteria.list();
它会导致以下SQL查询。
FROM incbszdb.seizure this_
INNER JOIN incbszdb.seizure_i18n seizurei18x1_
ON this_.id = seizurei18x1_.id
LEFT OUTER JOIN incbszdb.seizure seizure4_
ON seizurei18x1_.id = seizure4_.id
第二次加入癫痫发作
LEFT OUTER JOIN incbszdb.seizure seizure4_
ON seizurei18x1_.id = seizure4_.id
来自?
答案 0 :(得分:1)
我认为 Hibernate添加了这个连接,因为在加载SeizureI18n时,它无法知道SeizureI18n是否有相关的Seizure。因此,它无法知道是否必须使用null或Seizure实例(或Seizure实例的代理)填充占用字段。当然,在这个特定的查询中,它似乎很奇怪。但是如果你只是在没有癫痫发作的情况下装载SeizureI18n,那就更正常了。
如果SeizureI18n始终具有关联的癫痫发作,则应将关联标记为非可选(optional = false
)。我认为它应该避免额外的连接(因为Hibernate会知道有一个关联的Seizure,因此该属性永远不会为null)。