簡體   English   中英

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

[英]Hibernate/Dropwizard: Find or create with @UnitOfWork does not work

我們有一個用dropwizard編寫的rest API。 API的一項功能是創建以下形式的事件三元組:userID-動作-itemID如果此userID / itemID組合尚無任何動作,我們將創建一個新事件。 相應的資源函數具有@UnitOfWork批注:

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

如果這是此特定用戶ID或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的文檔中,我們假定所有內容都將封裝在事務中,因此不應發生這種情況。 當我們添加了一個itemItem應該唯一的數據庫約束時,我們得到一個PSQL異常“重復的鍵值違反了唯一約束...”。

我想念什么?

限制HTTP請求的事務不會阻止您所描述的問題。 您尚未向數據庫提供任何指示,以指示應使用什么來防止重復插入。 除非有一個數據庫約束指示事件ID應該是唯一的,否則數據庫不能說出它是在單獨的請求中創建的同一實體。

根據您的描述,我認為您對數據庫沒有這種限制。 如果是這樣,請添加一個,然后看看會發生什么。 如果不是這種情況,則可能要使用用於事件表的架構來更新您的帖子。

事務不會自動鎖定行,這是阻止其他線程/請求所必需的。 您需要使用LockMode.PESSIMISTIC_WRITE或類似的方法來完成此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM