Хибернация, заменяща модификациите на базата данни със състояние на отделен обект

Ще отида с този дизайн:

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

И трябва да синхронизирам състоянието му със състоянието на базата данни.

Това, което искам да постигна е, че:

IF между моите db операции, тоест модификации, които запазвам в db

някой умишлено разваля редовете на таблицата, след което при следващото записване в база данни

всички тези промени ЩЕ БЪДАТ ЗАМЕНЕНИ със състоянието на обекта, което винаги съдържа валидни данни.

Какви методи на Hibernate ми препоръчвате да използвам, за да запазя модификациите в база данни?

saveOrUpdate() е възможно решение, но може би има нещо по-добро?

Пак повтарям как изглежда. Първо създавам обект без колекции. Запазете го (save()).

След това потребителят ни предоставя допълнителни данни. В serviceLayer отново модифицираме нашия обект в паметта (да речем, попълваме го с колекции) и след това го запазваме отново.

Така че всяка операция на serviceLayer от следващата стъпка трябва просто да гарантира, че базата данни съдържа точното постоянно копие на този обект, което имаме в паметта. Ако данните в база данни се различават, те ТРЯБВА ДА БЪДАТ ЗАМЕНЕНИ със състоянието на обекта (запазен в паметта).

Какви сесийни операции препоръчвате?


person EugeneP    schedule 18.04.2010    source източник


Отговори (1)


FWIW saveOrUpdate() изглежда като най-добрият вариант като цяло:

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

Въпреки това, за вашия случай, ако сте сигурни, че обектът е бил модифициран в отделено състояние и/или нямате нищо против от време на време да натискате DB с ненужна АКТУАЛИЗАЦИЯ, може би update() е най-безопасният избор:

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

Цитати от Java Persistence with Hibernate, глава 11.2.2.

person Péter Török    schedule 18.04.2010