【问题标题】:What is the best pattern for creating an entity if it doesn't exist in JPA如果 JPA 中不存在创建实体的最佳模式是什么
【发布时间】:2013-02-13 11:19:51
【问题描述】:

这与question 相关,但非常具体地说明了 Pascal 在his answer 中指出的问题。

如果实体不存在(它的主键不在数据库中),我需要将其持久化,否则我需要重试新实体的生成并将其持久化。

我们基本上有一个使用过的记录表,我在其中生成随机数,但我不能有重复(而且我不能使用 UUID 或类似的东西)。所以我们在一张表中跟踪使用过的,以数字作为主键。

如何使用 JPA 确保仅在它存在时才创建它,从而避免竞争条件?我需要避免这样的情况:线程一个查询是否存在,然后线程两个查询,然后线程一个插入,然后线程两个插入 - 重复。

显而易见的选择是尝试捕获异常。问题是事务在 EntityExistsException 上回滚,但我想回滚并保留下一个随机数,而不是回滚事务。

丑陋的解决方案似乎是在单独的事务中调用新实体的持久化(所以让它回滚)。这里有更好的做法吗?

如果能明确知道原因是重复,这样当潜在问题是其他问题时,进程就不会继续重试。

【问题讨论】:

    标签: jpa ejb jpa-2.0 jboss7.x ejb-3.1


    【解决方案1】:

    entityManager.merge() 会为你做这件事。请参阅以下link 了解更多信息。

    【讨论】:

    • 不幸的是,这在这种情况下不起作用,因为随机数也有一个关联的字段(它是为客户生成的)。在合并情况下,它将覆盖该字段。但这在摘要中是一个很好的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 2012-12-27
    • 2010-09-16
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    相关资源
    最近更新 更多