如果JPA中不存在实体,那么创建实体的最佳模式是什么

时间:2013-02-27 15:18:48

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

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

如果实体不存在(我的主键不在数据库中),我需要保留一个实体,否则我需要重新生成一个新实体并坚持下去。

我们基本上有一个使用过的记录表,我在那里生成随机数,但我不能重复(我不能使用UUID或类似的东西)。因此,我们会在表格中跟踪使用的数字,并将数字作为主键。

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

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

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

最后明确地知道原因是重复也是很好的,这样当底层问题出现问题时,进程就不会继续重试。

1 个答案:

答案 0 :(得分:1)

entityManager.merge()会为您做到这一点。有关详细信息,请参阅以下link