是存在这个问题,网上也有专门讨论的
当调用save方法的时候,hibernate把持久化对象添加到缓存,又把该对象添加到一个要进行插入的集合inserts里
而调用evict方法只是把该对象从缓存中清空了,当执行flush操作或者事务提交之后,inserts执行完毕后要更新缓存中该对象的持久化标志位为已经持久化,但是没更新到,就出现上述错误
而调用clear会清空掉缓存和inserts集合、updates集合和deletes集合,所以调用clear之后不会出错,数据库中也不会有记录出现。如果hibernate的autocommit配置为true的话,可以在evict之前调用flush
如果hibernate的autocommit配置为false的话,就不能那么用了,去掉evict