Я пытаюсь проверить, был ли редактируемый объект изменен другим источником.Мне удалось обнаружить изменения в связях @ManyToOne и примитивных полях, однако коллекции не были затронуты:
@OptimisticLocking(type = OptimisticLockingType.ALL_COLUMNS)
@Entity(name = "RNC_RELATORIO")
public class RncRelatorio implements Serializable{
@ManyToOne
@JoinColumn(name = "emitente_id")
private SosUsuario emitente;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "relatorio", orphanRemoval = true)
private List<RncAcao> acoes = new ArrayList<>();
...
Я нашел несколько статей об использовании версий, создавая другое поле в таблице, которое увеличивается после каждого обновления,Есть ли другой способ?Если нет, где должен быть размещен столбец версии?
РЕДАКТИРОВАТЬ 1:
Я добавил столбец версии в таблицу RNC_RELATORIO и сопоставил его в сущности RncRelatorio с аннотацией @Version.Также изменились тип @OptimisticLocking и значение каскада.Теперь каждый раз, когда я редактирую объект и пытаюсь обновить его, я получаю исключение, если версия из таблицы базы данных не равна версии одного объекта.Это происходит, даже если во время обновления ничего не изменилось в объекте, но это не проблема.
@OptimisticLocking(type = OptimisticLockingType.VERSION_COLUMN, cascade = true)
@Entity(name = "RNC_RELATORIO")
public class RncRelatorio implements Serializable{
@Version
private int version;
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
...
РЕДАКТИРОВАТЬ 2
Когда я пытаюсь получить sysdate из базы данных Oracle, я получаю исключение оптимистической блокировки после изменения базы данных где-то еще, даже если япросто запустил выбор через DAO RncRelatorio и не пытался обновить строку таблицы.Есть идеи почему?
public class GenericDAO<T> implements Dao<T> {
private final Class<T> clazz;
private final EntityManager em;
public GenericDAO(Class<T> _clazz) {
this.clazz = _clazz;
this.em = PersistenceFactory.getInstance();
}
@Override
public Date getSysdate() {
Query q = em.createNativeQuery("select sysdate from dual");
List<Timestamp> l = q.getResultList();
Date d = new Date(l.get(0).getTime());
return d;
}
}
public class RncRelatorioDao extends GenericDAO<RncRelatorio>{
public RncRelatorioDao() {
super(RncRelatorio.class);
}
}