我正在尝试检查正在编辑的实体是否已被其他来源更改。我设法检测到@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表中添加了一个version列,并使用@Version批注将其映射到RncRelatorio实体中。还更改了@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
当我尝试从Oracle数据库获取sysdate时,即使我只是通过RncRelatorio DAO运行选择,而不是尝试更新表行,但在其他地方更改数据库后,也会收到乐观锁定异常。知道为什么吗?
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);
}
}
答案 0 :(得分:1)
我发现的解决方案是添加一个版本列,因此,即使更新中未进行任何更改,该版本仍会增加1。这样,我可以检查是否有更改。