Hibernate Criteria API - создать автоматическое объединение - PullRequest
1 голос
/ 15 августа 2011

У меня есть следующие настройки

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 

?

1 Ответ

1 голос
/ 15 августа 2011

I думаю Hibernate добавляет это объединение, потому что при загрузке SeizureI18n он не может знать, имеет ли SeizureI18n связанный с ним захват или нет. Поэтому он не может знать, должен ли он заполнить поле захвата значением NULL или экземпляром Seizure (или прокси для экземпляра Seizure). Конечно, в этом конкретном запросе это кажется странным. Но если бы вы просто загружали SeizureI18n без их Seizure, это было бы более нормально.

Если у SeizureI18n всегда есть связанный захват, вы должны пометить ассоциацию как необязательную (optional = false). Я думаю, что следует избегать дополнительного объединения (поскольку Hibernate будет знать, что существует связанный захват, и, таким образом, свойство никогда не будет нулевым).

...