如何防止重复插入行?

时间:2015-03-25 17:51:08

标签: hibernate dropwizard concurrent-programming

我为这个模糊的问题道歉,但我不知道怎么把它放在一个句子里。这就是为什么我甚至不能尝试谷歌这一点。

我有DropWizard资源,我使用Hibernate访问我的数据库。我有以下具有属性的实体。

Trip
====
id
from_place
to_place
time
user_who_booked_it
trip_group_ref

TripGroup
=========
id
from_place
to_place
time

TripGroup基本上将所有来自地点和时间的行程分组。这对其他一些任务有帮助。

创建Trip对象的资源首先需要检查匹配的TripGroup是否存在,如果不存在则创建一个。{p}这带来了一个问题。如果存在并发请求,则可能会创建两个具有完全相同参数的TripGroup个实例。

我该如何解决这个问题?

一种可能的解决方案是我将代码的一部分包装起来,在synchronized块中检查并创建这些对象。但是,也许这不会起作用,因为在资源的方法完成之后,即在synchronized块之外,将触发提交。

1 个答案:

答案 0 :(得分:0)

实际上应该在数据库级别设置复制约束。即使您可以处理应用程序代码中的所有并发问题,也没有什么能阻止数据库客户端将重复的TripGroup行直接插入到表中。

在Dropwizard中,如果您使用Hibernate,则可以使用以下内容注释TripGroup模型类:

@Entity
@Table(name = "trip_group", uniqueConstraints = @UniqueConstraint(columnNames = {"id", "fromPlace", "toPlace", "time"}))
public class TripGroup

这将在您的数据库中创建一个约束,并且在违反时会出现错误。如果您使用JDBI,则需要手动创建表格或使用Liquibase