hibernate中某个PO,name要求唯一。操作中先删除名为aaa的PO,再新增名为aaa的新PO,结果报唯一性冲突
hibernate中某个PO,name要求唯一。
操作中我们先删除名为aaa的PO,再新增名为aaa的新PO,结果报唯一性冲突。
//先删掉 名为aaa的PO TestPO testPO = dao.findByName("aaa"); dao.deleteById(testPO.getId()); //再新增 名为aaa的PO TestPO testPO1 = new TestPO().setName("aaa").setBeginDate(new DateTime()); dao.save(testPO1);
这个会报错: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'aaa' for key 'UK_4b35fof6m4sckfx6jb9fg1w26'
很奇怪,不是先删掉,后面再新增的吗? 为什么会报错呢?
因为 事务commit时 会自动做一个操作 flush。
flush有一个特性,就是此方法会按save,update,delete的顺序将缓存与数据库同步。
问题就在这里,它会先 save 后 delete,而不是按照我们代码中的顺序:先delete 后 save。
所以就报错了。
解决方法是:
在删除后加入 dao.flush();
@Transactional public void deleteAndSave(CheckResult cr){ //先删掉 名为aaa的PO TestPO testPO = dao.findByName("aaa"); dao.deleteById(testPO.getId()); dao.flush(); //再新增 名为aaa的PO TestPO testPO1 = new TestPO().setName("aaa").setBeginDate(new DateTime()); dao.save(testPO1); }
浙公网安备 33010602011771号