我有一個表,如(id INTEGER, sometext VARCHAR(255), ....)
與id
作爲主鍵和sometext
上的唯一約束。它在Web服務器中使用,請求需要找到與給定sometext
對應的id
(如果存在),否則會插入新行。防止違反與休眠的唯一約束
這是此表上唯一的操作。此表沒有更新,也沒有其他操作。其唯一目的是持續地遇到值爲sometext
的數量。這意味着我不能放棄id
並使用sometext
作爲PK。
我做到以下幾點:
- 首先,我諮詢我自己的緩存,以避免任何DB訪問。幾乎總是這樣,我就完成了。
- 否則,我使用Hibernate Criteria找到
sometext
所在的行。通常,這個工作,並再次,我完成了。 - 否則,我需要插入一個新行。
這工作正常,除了有兩個重疊的請求相同sometext
。然後結果爲ConstraintViolationException
。我需要類似INSERT IGNORE
或INSERT ... ON DUPLICATE KEY UPDATE
(Mysql語法)或MERGE(Firebird語法)。
我不知道有什麼選擇?
AFAIK休眠merge
只適用於PK,所以不適用。我猜,原生查詢可能會有所幫助,因爲它可能會或可能不會在第二個INSERT發生時提交。
我不明白你爲什麼不能使用一些文字作爲PK。 – Thilo
另外,爲什麼你不能只是趕上ConstraintViolationException(並忽略它)? – Thilo
@Thilo 1.因爲我需要一個數字而不是文本。這就是我使用'id'的原因。也許我可以使用'sometext'並將數字存儲在另一列(我可以通過其他方式保證唯一性)。 +++ 2.如果我知道它不是由其他東西引起的,我可以。但表名在例外情況下不可用。此外,它發生在'SessionImpl.flush'(而不是INSERT)中,這很可能意味着什麼都不存儲。 – maaartinus