级联乐观锁定到@OneToMany 关系

Cascade optimistic locking to @OneToMany relationships

我正在尝试检查正在编辑的实体是否被其他来源更改。我设法检测到@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<>();

...

我找到了一些关于通过在 table 中创建另一个字段来使用版本控制的文章,该字段在每次更新后都会递增。还有别的办法吗?如果不是,version 列应该放在哪里?

编辑 1:

我在 RNC_RELATORIO table 中添加了一个版本列,并使用 @Version 注释将其映射到 RncRelatorio 实体中。还更改了 @OptimisticLocking 类型和级联值。现在每次我编辑一个对象并尝试更新它时,如果数据库 table 的版本不等于一个对象的版本,我就会得到一个异常。即使在更新期间实体中没有任何更改,也会发生这种情况,但这不是问题。

@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

当我尝试从 Oracle 数据库获取 sysdate 时,即使我只是 运行 select 通过 RncRelatorio DAO 而不是在其他地方更改数据库后,我得到了乐观锁定异常尝试更新 table 行。知道为什么吗?

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。这样我可以检查是否有更改。