我有以下设置

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


来自哪里?

最佳答案

我认为Hibernate之所以添加此联接,是因为在加载SeizureI18n时,它不知道SeizureI18n是否具有关联的Seizure。因此,无法确定他是否必须使用null或Seizure实例(或Seizure实例的代理)填充seizure字段。当然,在此特定查询中,这似乎很奇怪。但是,如果您只是在没有Seizure的情况下加载SeizureI18n,则感觉会更正常。

如果SeizureI18n始终具有关联的癫痫发作,则应将关联标记为非可选(optional = false)。我认为应该避免额外的联接(因为Hibernate知道存在关联的Seizure,因此该属性永远不会为null)。

10-06 02:23