Hibernate: мне когда-нибудь нужно очищать ()? - PullRequest
7 голосов
/ 12 сентября 2011

У меня двунаправленные отношения один ко многим.Я пытаюсь сохранить это как в этом документе:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/example-parentchild.html#example-parentchild-bidir

Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
c.setParent(p);
p.getChildren().add(c);
session.save(c);
session.flush();

Требуется ли там flush()?Что именно это делает?Я знаю, что он делает, но я обнаружил, что это стоит мне 100 мс, и я действительно хотел бы избежать этого, если это возможно.

Когда вызывается session.load() или даже session.refresh(), а я не сбросил,это включает в себя новый Child в коллекции?

Ответы [ 4 ]

12 голосов
/ 12 сентября 2011

Вызов flush синхронизирует состояние сеанса с базой данных.Вам не нужно явно очищать в этой точке.Hibernate достаточно умен, чтобы знать, когда ему необходимо обновить базу данных с помощью сеанса, например, перед выполнением запроса.

В какой-то момент придется понести стоимость 100 мс, поскольку это неизбежное последствие использования базы данных в вашемприложение.Hibernate может отложить эту операцию и выполнить пакетные изменения базы данных, чтобы минимизировать количество обращений к базе данных.

Hibernate сбросит сеанс, когда транзакция завершится (по умолчанию), и поэтому, если вы вызываете load в том же сеансе, выполучит тот же объект обратно из сеанса.Если вы вызовете load в новом сеансе, Hibernate сбросит изменения, и ваш ребенок будет в коллекции.

Если вы очистите сеанс или удалите свой объект из сеанса до выполнения сброса, вы быобнаружите, что вашего ребенка нет.

Эта глава из документов должна помочь.

5 голосов
/ 12 сентября 2011

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

Когда вызывается session.load () или даже session.refresh (), а я не покраснела, будет ли он включать нового ребенка в коллекцию?

Если вы находитесь в том же сеансе и вызываете session.refresh, ваши ручные изменения будут потеряны. если вы находитесь в другом сеансе и вызываете session.refresh, они не будут включать ваши изменения вручную.

1 голос
/ 12 сентября 2011

Если вы хотите сделать что-то «простое» и не отменяемое, но уже находящееся внутри транзакции, вы можете выполнить сброс, сделать то, что само по себе не вызывает сброс, и если вы обнаружите, что вам не нужно то, что вы сделали, вы можете выселить измененноеобъекты.

Но это пахнет, но иногда это может быть самой простой вещью, которая работает (учитывая некоторый вонючий код для начала).

0 голосов
/ 26 июля 2013

Flush выполнит все ожидающие операторы SQL для сущностей, ранее помеченных для сохранения (т.е. сохранить / создать / объединить / сохранить / удалить / удалить и т. Д.).

Одна важная вещь, которую это делает, это запуск проверки ограничения БД. Поэтому, если вы хотите / должны корректно обрабатывать нарушения ограничений по мере их возникновения (т.е. с вызывающей INSERT / UPDATE / DELETE), вам необходимо выполнить сброс после сохранения / создания / слияния / сохранения / удаления / удаления.

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