EntityManager.merge () выдает SELECT для всех объектов в графе объектов - PullRequest
4 голосов
/ 24 февраля 2011

Я использую JPA 2 и Hibernate 3. Я заметил, что вызов EntityManager.merge() вызывает SELECT для каждой ссылочной сущности в графе объектов, плюс внутренние соединения между некоторыми из них.

Предположим, вы хотите объединить() a FooBar.

@Entity
public class FooBar {
    @ManyToOne
    private Foo foo;

    @ManyToOne
    private Bar bar;
}

@Entity
public class Foo {
    @ManyToOne
    private Baz baz;
}

@Entity
public class Bar {
    @ManyToOne
    private Baz baz;
}

Если вы это сделаете, Hibernate выдаст SELECT для каждого из FooBar, Foo и Bar и два для Baz.Затем он выдаст SELECT для Foo, соединенного с Baz, и еще один для Bar, соединенного с Baz.Поскольку я просто хотел объединить FooBar, я ожидал от него одного SELECT, но в итоге я получил колоссальные 7 SELECT!

Прежде всего, это нормально?Во-вторых, если это так, есть ли способ выдать только один SELECT?

Спасибо.

1 Ответ

5 голосов
/ 24 февраля 2011

Вы звоните merge(..) с отсоединенным объектом (т. Е. С тем, который не связан с сеансом).Что делает здесь hibernate - он загружает сущность с идентификатором переданного объекта из базы данных и:

  • , если запись не найдена, вставляет переданный объект
  • , если объектнайден, передает все поля и возвращает постоянный объект

В последнем случае происходит загрузка из БД, поэтому Hibernate должен извлечь весь объект.Отсюда множество вариантов выбора.

Вы можете попробовать fetchType=LAZY для отношений ManyToOne (по умолчанию они стремятся).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...