SaveOrUpdate中的唯一约束违规错误

时间:2012-10-19 18:23:37

标签: java multithreading hibernate unique-constraint

我有一个名为customer的hibernate实体,其中包含有关customer的信息。在我的方法中,我将客户详细信息作为参数,我需要在数据库中插入。因此,要删除重复的条目,我要检查该客户是否已经存在于db中。但问题是,如果在同一个客户信息的同一时刻对同一方法进行两次调用,那么我就会遇到约束违规错误。我以为saveOrupdate()会解决问题,但它没有。有人可以为这种情况建议解决方案。

2 个答案:

答案 0 :(得分:4)

saveOrUpdate用于完全不同的目的。这是为了坚持一个可能已经存在的实体(拥有id和all)或者它可能是一个新鲜的id。它与并发访问没什么关系。

对于您的问题,有两个选项,称为乐观锁定和悲观锁定。

悲观锁定:在检查客户是否存在之前创建锁定,因此只有当前线程可以继续,它会进行检查并采取相应措施。具有相同数据的任何其他线程都必须等到第一个线程的更新或插入完成。如果你在一台机器上运行,可以使用休眠或简单的同步块在数据库中实现锁定。

乐观锁定:您就像现在一样继续前进。但是你设置了一个异常处理程序来处理你在问题中描述的碰撞情况。

使用同步块可能更容易实现悲观锁定,但它会影响性能和可伸缩性。

答案 1 :(得分:1)

saveOrUpdate处理对象中的主键attriute值,例如如果0是新对象的默认值,并且您的新customer对象将主键属性设置为0,那么它将始终尝试保存(插入)并且永远不会尝试更新。仅当主键属性为非零值时,它才会尝试更新。这就是saveOrUpdate无法解决问题的原因。

我不确定你可以做什么比处理unique约束异常更好。