java - 级联乐观锁定到@OneToMany 关系
问题描述
我正在尝试检查正在编辑的实体是否被另一个来源更改。我设法检测到 @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 注释将其映射到 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);
}
}
解决方案
我找到的解决方案是添加一个版本列,因此,即使更新中没有任何更改,版本仍会增加 1。这样我可以检查是否有更改。
推荐阅读
- python - 用于处理bedpe格式的python包
- php - PHP在函数内填充数组
- json - JSON可以有一个布尔根元素吗
- python - 导入函数的权限问题
- python - Tensorflow 获取一个张量的数量
- c# - “ExecuteReader:连接属性尚未初始化。”
- javascript - 与元素类型“脚本”相关联的属性“src”需要打开引号
- javascript - 我很困惑如何从我的烧瓶 python api 将数据发送到我的 AJAX 表单
- javascript - 你如何让 JQuery 与 Rails 6 和 Webpacker 6 一起工作
- list - 当用户对第二个反应做出反应时,机器人不会读取第二个反应.. discord.py