Hibernate: Обновление родителя многие-к-одному - PullRequest
5 голосов
/ 22 февраля 2011

У меня есть два класса: Parent и Child, сопоставленные один-ко-многим с отношениями, принадлежащими Child.Я также использую кэш 2-го уровня с Ehcache.

Чтобы сохранить связь, я делаю это:

child.setParent(parent);
session.saveOrUpdate(child);
parent.getChildren().add(child);

Когда я загружаю parent в другой сессии (из кеша 2-го уровня),будет ли это добавленное child видимым?Как правильно обновить коллекцию родителей в этой ситуации?

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

быть ясным: все происходит внутри транзакции, которая правильно зафиксирована.Главный вопрос: Это правильный способ обновления parent.children для этого Session и для других в кэше 2-го уровня?

Еще один момент: Что мне делатьвывести такую ​​коллекцию из кэша 2-го уровня при откате?

Ответы [ 4 ]

0 голосов
/ 25 октября 2011

Это зависит от стратегии кэширования, которую вы выбрали для этой коллекции parent.children (READ_ONLY, NONSTRICT_READ_WRITE ...).Если это не READ_ONLY, а постоянное использование child выполнено правильно, hibernate исключит коллекцию из кэша 2-го уровня.

0 голосов
/ 23 февраля 2011

По моему мнению, это из-за природы изоляции базы данных, то, что не зафиксировано, не должно быть видимым для другого соединения с базой данных (в языке Hibernate вещи, которые не зафиксированы, не должны быть видны другим сеансам Hibernate). Чтобы быть видимым в других сеансах Hibernate, необходимо зафиксировать транзакцию (на языке Hibernate зафиксировать сеанс Hibernate).

Transaction tx = session.beginTransaction()

child.setParent(parent);
session.saveOrUpdate(child);
parent.getChildren().add(child);

tx.commit()

Я цитирую этот сайт документации

В неуправляемом контексте:

Вам не нужно сбрасывать () сеанс явно: вызов commit () автоматически вызывает синхронизация в зависимости от FlushMode для сеанса. Вызов close () отмечает конец сеанса. Основным следствием close () является что соединение JDBC будет отказался от сессии. Эта ява код переносим и работает в обоих неуправляемые среды и среды JTA.

0 голосов
/ 23 февраля 2011

Это будет видно, если вы используете Eager loading ..

Для отложенной загрузки вам нужно инициализировать его:

Parent p = em.find(Parent.class, 1);
Hibernate.initialize(p);
System.out.println(p.child);

Более подробную информацию об этом можно найти здесь.

0 голосов
/ 22 февраля 2011

Какой тип кэша вы используете?

Эта последовательность отлично работает для меня:

child.setParent(parent);
parent.getChildren().add(child);
session.saveOrUpdate(child);
session.flush();

Кроме того, убедитесь, что вам действительно нужен этот кэш.По моему опыту, кэш 2-го уровня редко ускоряет реальные приложения, но создает много проблем.

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