当前位置: 首页 > 知识库问答 >
问题:

Hibernate/Dropwizard:使用@UnitOfWork查找或创建不起作用

宣意致
2023-03-14

我们有一个用dropwizard编写的RestAPI。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

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

我错过了什么?

共有2个答案

羊舌昆杰
2023-03-14

事务不会自动锁定该行,这是阻止其他线程/请求所必需的。你需要使用LockMode。PESSIMISTIC_WRITE,或类似的,来实现这一点。

祖翰音
2023-03-14

限制HTTP请求的事务不会阻止您所描述的问题。您还没有给数据库任何指示,说明它应该使用什么来防止双重插入。除非有一个数据库约束指示事件ID应该是唯一的,否则数据库不能告诉它是在不同的请求中创建的同一个实体。

根据您给出的描述,我假设您对数据库没有这样的约束。如果是这样,添加一个,然后看看会发生什么。如果不是这样,您可能希望使用事件表使用的模式更新post。

 类似资料:
  • 由于某些原因,我的位图创建不起作用。我找到一只虫子了吗?当我尝试使用矩阵创建一个新位图时,它说我的宽度和高度必须大于0,这毫无意义。 我知道这看起来好像我没有做过任何研究,我做过,但这没有意义。我已经尝试了很多事情,包括将新宽度和新宽度更改为常量,但它仍然不起作用。如果有帮助的话,这是堆栈跟踪 我正在尝试制作一个旋转门户。我想有一个矩阵平移,旋转和缩放,但我没有得到工作。我决定把译文拿出来,只是做

  • 我正在开发dropwizard应用程序和js ui,以便与api交互。我需要加载json数据来更新视图,但在此之前,我必须在dropwizard中启用cors。我做了一些工作人员,但它似乎不起作用,因为dropwizard始终不返回任何内容。

  • 我有一个子类,它重写了超类的getter(因为它添加了不同的行为)。我正在使用@AttributeOverride,但它会抛出错误org.hibernate.mappingException:在com.hbmap.domain.product中也发现名称的重复属性映射。 完整StackTrace:

  • 问题内容: 我是php的新手,这可能是一个愚蠢的错误……但是我不知道发生了什么。我正在尝试使用php在数据库中创建一个表。我想用用户名命名该表。我正在使用变量。这是我的代码 因此,这将创建一个名为的表。变量不会保留。但是- 当我-变量结转。我对此很陌生- 因此,感谢您的帮助。 问题答案: 在您的SQL查询之后添加它-(它确实可以帮助并加快错误纠正时间) 回声 这在您的实例: 发生MySQL错误。错

  • 问题内容: 我正在尝试但未能成功在具有以下 依赖项的* Spring Data 和 Hibernate environmet中缓存查询: * 我的实体服务的Spring Data Repository(ServiceRepository)是 从中调用存储库的@Cacheable方法 我的缓存配置文件(jpa-context.xml)是 它的灵感来自spring-data-jpa-examples

  • 我使用Spring Boot 1.4.1和spring-boot-starter-data-jpa 当查询我的自定义方法时,比如'find byname(String name)',它不是缓存。