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);

    }

 

posted on 2019-08-17 17:43  HB1  阅读(446)  评论(0)    收藏  举报

导航