Как я могу убедиться, что значение, обновляемое с помощью Hibernate, не было изменено с тех пор, как я его прочитал? - PullRequest
1 голос
/ 04 декабря 2008

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

Код выглядит примерно так:

// Load from DB

Criteria crit = session.createCriteria( Dummy.class ).add( Restrictions.eq("id", 5) );

Dummy val = crit.uniqueResult();

// Processing time elapses.

// Update value of dummy.

val.x++;

// Save back to database. But what if someone modified the row with ID  = 5 in the meantime, and changed the value of x?

session.saveOrUpdate( val );

Ответы [ 2 ]

2 голосов
/ 04 декабря 2008

Я бы рекомендовал вместо этого оптимистическую блокировку. вы добавляете свойство «версия» к своему объекту, а затем в конце hibernate выполняет операцию обновления и проверяет, что версия не изменилась с момента чтения объекта. как правило, гораздо лучший дизайн, чем пессимистическая блокировка (ничего подобного нахождению этих тупиков db!).

Конечно, остается вопрос, что вы планируете делать, если объект изменился?

0 голосов
/ 04 декабря 2008

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

Поскольку ваш объект извлекается из БД, вам необходимо заблокировать БД, чтобы никто не изменил ваш объект во время работы с ним.

Для этого вам необходимо заблокировать ваш объект.

session.lock( myObject , LockMode.UPGRADE );

Попробуйте.

EDIT

Это может быть больше вас:

// Load from DB

Criteria crit = session.createCriteria( Dummy.class ).add( Restrictions.eq("id", 5) );

crit.setLockMode( LockMode.UPGRADE  ); // issues a SELECT ... for UPDATE... 

Dummy val = crit.uniqueResult();

 etc.etc

Criteria.setLockMode ()

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