我有一个实体(javax.persistence)对象有三个字段--A,B和删除。组合(A,B,删除)应该是唯一的。我使用true / null作为删除的值,以便在MySQL中唯一约束保持良好。
假设我已经在db(1,a1,b1,true)中有记录。现在我正在尝试将该记录的已删除更新为null,同时插入一个新对象(2,a1,b1,true)。所以,我的表将事务的结尾看作(1,a1,b1,null),(2,a1,b1,true)。但是,此代码因唯一约束违规而失败。我将此理解为预期的行为,因为在提交事务之前,现有记录将触发违规异常。
有没有办法做我想做的事情而没有抛出异常?
伪代码:
整个事情都在标记为Transactional的方法中。
dbObj = repo.find(..) // returns (1, a1, b1, true)
newObj = copyFrom(dbObj) // creates another (a1, b1, true)
dbObj.setValid(null)
repo.save(dbObj)
repo.save(newObj)
答案 0 :(得分:0)
我建议您按照下面伪代码中的步骤来实现此目的。
1)将有效指标列值的默认值定义为false。
private void saveObject(){
dbObj = repo.find(..)
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
dbObj.setValid(false);
tx.persist(dbObj);
em.flush();
newObj(a1,b1,true);
tx.persist(newObj);
em.flush();
tx.commit();
}