Использование Spring 3.1 / JPA 2, предоставляемого Hibernate 4.1.0.
У меня есть базовый класс для всех моих сущностей, который обеспечивает базовые возможности аудита (метка времени обновления, номер версии и т. Д.), Поскольку другие приложения обращаютсянаша база данных, они должны быть установлены через триггер.
Мое отображение выглядит следующим образом:
public abstract class AbstractBaseModel implements Serializable {
@Version
@Generated(GenerationTime.ALWAYS)
@Column(name = "VERSION", insertable = false, updatable = false)
protected Long version;
@Generated(GenerationTime.ALWAYS)
@Column(name = "UPDATE_TIMESTAMP", insertable = false, updatable = false)
protected Date updateDate;
...
}
Метод org.hibernate.engine.internal.increment(...)
всегда вызывается при совершении транзакции - и в результате получается StaleObjectStateException
.
Как ни странно, если я установлю GenerationTime.NEVER
в столбце версии, hibernate по-прежнему увеличивает версию, но сохраняется правильно.Проблема заключается в том, что даже если версия в базе данных не обновляется (например, нет изменений в таблице), версия, возвращенная после слияния, будет на 1 больше, чем значение базы данных, что, очевидно, вызовет проблемы при последующем сохранении.
Я ожидаю, что GenerationTime.ALWAYS
скажет hibernate никогда не пытаться увеличивать версию и полагаться на базу данных, чтобы сделать это, а затем после вставки / обновления выбрать обновленное значение.
Может кто-нибудь сказать мне, где я ошибся в моем понимании и реализации?