在以下情况下,当在批处理中调用事务注释方法时,attachDirty saveOrUpdate()
总是尝试保留实体。
是否有避免这种主键约束违例异常的方法?我认为如果实体尚未创建,saveOrUpdate()
将继续存在,否则将对其进行更新。
我使用此..orUpdate()
而不是persist()
作为处理这些突发事件的方法。
实际上没有数据损坏。因为第一个saveOrUpdate()
确实为每个实体保存了1条记录。由于主键约束冲突,其他持久化被数据库拒绝。
我研究了乐观和悲观的锁定。我了解到这些工作是在获取已经存在的记录之后进行的。这里的实体是新的,不存在。
如何更好地解决这个问题?
答案 0 :(得分:1)
为什么异常是一个问题,您不能忽略它吗?如果您的数据库支持“ upsert”,那么从理论上讲,您可以通过在实体上添加以下注释来使用它:
@org.hibernate.annotations.SQLInsert (sql = "INSERT INTO message_user (user_id) VALUES (?) ON CONFLICT DO NOTHING")