如何防止插入重复的行



我为这个模糊的问题道歉,但我不知道如何用一句话来表达。这就是为什么我甚至不能尝试用谷歌搜索出来。

我有一个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,如果不存在,则创建一个。这带来了一个问题。如果存在并发请求,则可能会创建两个或多个参数完全相同的TripGroup实例。

我该如何解决此问题?

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

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

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

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

这将在你的数据库中创建一个约束,当它被违反时,你会得到一个错误。如果您使用的是JDBI,那么您需要手工创建表或使用Liquibase

相关内容

  • 没有找到相关文章

最新更新