Изменения базы данных переопределения Hibernate с состоянием отдельного объекта - PullRequest
1 голос
/ 18 апреля 2010

Я пойду с этим дизайном:

создать объект и поддерживать его в течение всего сеанса работы с веб-приложением.

И мне нужно синхронизировать его состояние с состоянием базы данных.

Чего я хочу добиться, так это:

ЕСЛИ между моими операциями БД, то есть изменениями, которые я сохраняю в БД

кто-то намеренно портит строки таблицы, затем при следующем сохранении в базе данных

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

Какие методы Hibernate вы рекомендуете использовать для сохранения изменений в базе данных?

saveOrUpdate () - это возможное решение, но может быть, есть что-нибудь лучше?

Опять повторяю, как это выглядит. Сначала я создаю объект без коллекций. Сохраняйте это (save ()).

Затем пользователь предоставляет нам дополнительные данные. В слое serviceLayer мы снова модифицируем наш объект в памяти (скажем, заполняем его коллекциями), а затем сохраняем его снова.

Таким образом, каждая операция serviceLayer следующего шага должна просто гарантировать, что база данных содержит точную постоянную копию этого объекта, которую мы имеем в памяти. Если данные в базе данных отличаются, они ДОЛЖНЫ БЫТЬ ЗАПИСАНЫ с состоянием объекта (хранящегося в памяти).

Какие операции сеанса вы рекомендуете?

1 Ответ

2 голосов
/ 19 апреля 2010

FWIW saveOrUpdate() выглядит как лучший вариант в целом:

Метод saveOrUpdate () на практике более полезен, чем update(), save() или lock(): в сложных разговорах вы не знаете, находится ли предмет в отключенное состояние или если оно новое и временное и должно быть сохранено. Автоматический обнаружение состояний, предоставляемое saveOrUpdate(), становится еще более полезным, когда вы не только работать с единичными экземплярами, но также хочет заново подключить или сохранить сеть подключенных объектов и применять каскадные параметры.

Однако для вашего случая, если вы уверены, что сущность была изменена в отключенном состоянии, и / или не против случайного попадания в БД с ненужным ОБНОВЛЕНИЕМ, возможно, update() является самым безопасным выбором:

Операция update() на сеансе присоединяет отсоединенный объект к контексту постоянства и планирует SQL UPDATE. Hibernate должен предполагать, что клиент изменил объект пока он был оторван. [...] Контекст постоянства сбрасывается автоматически когда вторая транзакция в разговоре фиксируется, и любой изменения в когда-то отделенном и теперь постоянном объекте синхронизируются с базой данных.

Цитаты из Java Persistence с Hibernate, глава 11.2.2.

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