2015-10-29 2 views
2

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

    Bucket [1] ------ [Many] Element 

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

JPA имеет собственную версию, поэтому я планирую повторно использовать это. Но JPA охотно не обновляет версию Bucket, когда ее элемент был обновлен. Есть ли хороший способ, как обеспечить обновление версии для объекта в JPA?

В настоящее время я нашел какое-то предложение, например, создать фиктивное поле, иметь собственное поле версии или отсоединить и слить объект. Без них мне кажется, что это лучше?

Я использую ссылку eclipse с данными весны, если это помогает.

+0

Я уже использовал версию в JPA и он обновляется автоматически: это точка этой функции: Вы должны аннотировать поля (длинный тип) с @version. Если версия не является хорошей, генерируется исключение, и последняя транзакция отменяется. Не забудьте использовать блокировку оптимистов, чтобы избежать блокировки поля в базе данных в течение длительного времени. – rlm

+0

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

+0

@nafas пользователь имеет дело с dto, а не с сущностями, и это происходит за пределами транзакции. поэтому нет проблем с повреждением данных. и ни один пользователь не имеет оценок. кто бы ни спасал сначала, он преуспевает, не позволяя другим экономить – user902383

ответ

5

Вы можете использовать блокировку OPTIMISTIC_FORCE_INCREMENT для принудительного обновления вашего объекта Bucket при изменении отношения (т. Е. Добавление и удаление элементов в объекте коллекции один-ко-многим). Это приведет к сбою любых обновлений в любых других контекстах сохранения, если они внесут изменения, не зная о обновлении отношений.

Пример:

public void addElement(int bucketId, Element element) { 
    Bucket bucket = em.find(Bucket.class, bucketId); 
    em.lock(bucket, LockModeType.OPTIMISTIC_FORCE_INCREMENT); 
    bucket.add(element); 
    element.setBucket(bucket); 
} 
Смежные вопросы