Каскадная оптимистическая привязка к отношениям @OneToMany - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь проверить, был ли редактируемый объект изменен другим источником.Мне удалось обнаружить изменения в связях @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);
   }
}

1 Ответ

0 голосов
/ 29 января 2019

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

...