gpt4 book ai didi

java - hibernate/Dropwizard : Find or create with @UnitOfWork does not work

转载 作者:行者123 更新时间:2023-11-29 13:57:50 24 4
gpt4 key购买 nike

我们有一个用 dropwizard 编写的 rest API。 API 的一项功能是创建以下形式的事件三元组:userID - action - itemID如果此 userID/itemID 组合尚无任何操作,我们将创建一个新事件。对应的资源函数有@UnitOfWork注解:

@POST
@UnitOfWork
@Timed
public Event createEvent(Event event) {
return eventDAO.updateOrCreate(event);
}

如果这是该特定 userID 或 itemID 的第一个事件,我们将分别创建一个用户或一个项目。这是项目的功能(用户是相同的):

public Item getOrCreate(Event event) {
Item item = findOne(event.getItemId());
if(item == null) {
item = new Item();
item.setItemId(event.getItemId());
create(item);
}
return item;
}

问题是我们有重复的项目(即如果我们强制 itemId 是唯一的就会出错)。如果我们像这样在不同的线程中有两个请求

user1 action1 item1
user2 action2 item1

似乎两者都试图创造一个。来自documentation在 @UnitOfWork 中,我们假设所有内容都将包含在事务中,因此这不应该发生。当我们添加一个 itemId 应该是唯一的数据库约束时,我们得到一个 PSQL 异常“重复键值违反唯一约束...”。

我错过了什么?

最佳答案

绑定(bind) HTTP 请求的事务不会阻止您所描述的问题。您没有向数据库提供任何指示,说明它应该使用什么来防止双重插入。除非有指示事件 ID 应该是唯一的数据库约束,否则数据库无法判断它是在不同请求中创建的同一实体。

根据您提供的描述,我假设您对数据库没有这样的限制。如果是这种情况,请添加一个,然后看看会发生什么。如果不是这种情况,您可能希望使用用于事件表的架构更新您的帖子。

关于java - hibernate/Dropwizard : Find or create with @UnitOfWork does not work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28028958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com