2012-06-17 2 views
1

Я реализовал простой объект ejb с аннотацией @version. Я ожидаю, что номер версии будет увеличиваться после каждого обновления объекта.JPA - @Version - увеличение на чтение

@Version 
public Integer getVersion() { 
    return version; 
} 
public void setVersion(Integer version) { 
    this.version = version; 
} 

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

Может ли кто-нибудь объяснить, почему моя версия увеличивается и при чтении?

+0

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

+0

Я не установил никакой блокировки в моем коде. Я однажды установил FlushModeType.COMMIT в своем EJB, который имеет дело с сущностями. Но это, похоже, не имеет никакого влияния. 'manager.setFlushMode (FlushModeType.COMMIT);' Я бегу GlassFish 3.1.1 и с использованием базы данных MySQL с XADataSource – Ralph

+0

Включите код для чтения и журнал SQL для фиксации. Убедитесь, что вы не меняете объект. – James

ответ

2

Наконец-то я нашел причину странного поведения. Проблема возникает во время метода, когда я копирую все значения из моего (все еще прикрепленного) объекта в объект модели отдельного домена. Все это хорошо работает, так как я прочитал прикрепленный объект, содержащий структуру данных сложного типа (вектор, содержащий HashMaps). Я скопировал эти значения с помощью метода .addAll из интерфейса List:

List activePropertyValue = (List)mapEntry.getValue(); 
// value contains HashMaps! 
List detachePropertyValue = new Vector(); 
detachePropertyValue.addAll(activePropertyValue); 

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

Я решил эту проблему, отделяя объект, прежде чем скопировать все значения:

manager.detach(aEntity); 
..... 
List activePropertyValue = (List)mapEntry.getValue(); 
// value contains HashMaps! 
List detachePropertyValue = new Vector(); 
detachePropertyValue.addAll(activePropertyValue); 
Смежные вопросы