如何使用Hibernate模仿upsert行为? [英] How to mimic upsert behavior using Hibernate?

查看:158
本文介绍了如何使用Hibernate模仿upsert行为?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个应用程序,将来自第三方数据源的实体同步到我们自己的模式中,其间有转换/映射步骤。我使用Hibernate来表示并坚持我们自己的模式中的实体。我遇到的一个问题是我的桌子上有一个唯一的多列键。我希望看到的行为类似于upsert:当Hibernate持久存在一个实体并检测到一个唯一的约束冲突时,它会进行更新。我们正在使用MySQL,它提供了一个INSERT ... ON DUPLICATE KEY UPDATE语法,但是我不确定Hibernate如何以及如何使用它?



<我想我总是可以尝试插入,如果我发现一个异常做了一个更新,但这看起来很拙劣,并且不是最理想的。任何提示干净的方式来做到这一点?

解决方案


我们使用MySQL,它提供INSERT ... ON DUPLICATE KEY UPDATE语法,但我不确定如何以及如果Hibernate可以使用它?



<看起来有人通过重写 Hibernate使用这个实体的sql-insert 语句。如果你不介意不能移植(也可能使用存储过程),请看看。


我想我总是可以尝试插入,如果我发现异常做了一个更新,但这似乎很拙劣和不理想。任何提示干净的方式来做到这一点?


另一种选择是:


$ b $如果您找到记录,则
  • 对唯一密钥
  • 执行选择找不到记录,然后创建它

  • 但是,除非您在整个表中锁定该过程中,您可能会面临多线程和分布式环境中的一些竞争条件,并且步骤#3可能会失败。想象一下两个并发线程:

    线程1:


    • begin trans

    • 对某个键执行选择

    • 未找到记录

    • 创建记录




    线程2:

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆