Я определил объект, где @version используется для отслеживания версии транзакций.
public abstract class AbstractTrackableEntity extends AbstractSimpleEntity implements TrackableEntity<Long> {
private static final long serialVersionUID = 1998861325669866459L;
public static final long INITIAL_VERSION = 1L;
@Embedded
private HistoryTracking historyTracking;
@Version
@Column(name = "versioncnt", precision = 12, nullable = false)
private long version = INITIAL_VERSION;
@Override
public HistoryTracking getHistoryTracking() {
return historyTracking;
}
public void setHistoryTracking(HistoryTracking historyTracking) {
this.historyTracking = historyTracking;
}
@Override
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
}
Тест, написанный для генерации исключения, упомянут ниже:
@Transactional
@Test(expected = ObjectOptimisticLockingFailureException.class)
public void shouldThrowExceptionWhenSaveEntityWithOldVersion() {
T entity = getNewEntity();
getJpaRepository().saveAndFlush(entity); // generate version 1
entity.getHistoryTracking().setUpdateDateTime(LocalDateTime.now());
entity = getJpaRepository().saveAndFlush(entity); // generate version 2
entity.setVersion(1L);
getJpaRepository().saveAndFlush(entity); // should throw exception but it is not
}
Последнее saveAndFlu sh должно вызвать исключение ObjectOptimisticLockingFailureException, но оно выдает ошибку подтверждения и сохраняет версию как 3. она не переопределяет версию.