Я использую Hibernate 3.3.0.GA, и я заметил какое-то странное поведение, не документированное (я думаю).Различные SQL с помощью find и createQuery из диспетчера сущностей Hibernate
Я заметил, что entityManager.find
разрешает отношения EAGER
моей сущности и entityManager.createQuery
нет.
Пер Например, если у меня есть объект:
@Entity
public class Person {
@Id
private int id;
private String name;
@ManyToOne //EAGER by default in JPA
private Address address;
}
Сгенерированный SQL с entityManager.find(Person.class, 1L)
:
select
person0_.id as id1_1_,
person0_.address_id as address3_1_1_,
person0_.name as name1_1_,
address1_.id as id2_0_
from
Person person0_
left outer join
Address address1_
on person0_.address_id=address1_.id
where
person0_.id=?
и сгенерированный SQL с entityManager.createQuery("SELECT p FROM Person where id = 1")
:
select
person0_.id as id1_,
person0_.address_id as address3_1_,
person0_.name as name1_
from
Person person0_
where
person0_.id=?
Итак, есть объяснение, почему это происходит? Для меня оба должны иметь одинаковое поведение.
Рабочий пример
Я создаю пример в моем хранилище показывает эту проблему, используя Hibernate 4.1.6.Final: https://github.com/dherik/hibernate-find-em-so-question. Просто используйте mvn clean install
, и консоль распечатает запросы.
Обновлено
@KlausGroenbaek сказал 2.5.2 EclipseLink имеют такое же поведение в этих двух методов. Он также сделал пример Hibernate и получил аналогичный результат в двух методах (find
он делает выбор соединения и createQuery
он делает несколько выборок, как EAGER
по определению).
Оба запроса имеют одинаковое поведение, по крайней мере, с точки зрения того, что данные человека одинаковы для обоих. У вас есть определенный код, который имеет проблему? –
После того, как Пользователь загружен, он должен иметь действительный экземпляр адреса или null. ManyToOne может быть только ленивым, если вы используете плетение для создания подкласса Address. Вы уверены, что нет второго запроса для выбора адреса, может быть, он не зарегистрирован? –
Привет @TimBiegeleisen, да, у меня есть код (симуляция была там). К сожалению, я не могу поделиться этим кодом, но я могу создать пример в своем github и share. – Dherik