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