У меня есть таблица типа (id INTEGER, sometext VARCHAR(255), ....)
с id
в качестве первичного ключа и ограничением UNIQUE на sometext
. Он используется на веб-сервере, где запрос должен найти id
, соответствующий заданному sometext
, если он существует, иначе вставляется новая строка.
Это единственная операция над этой таблицей. В этой таблице нет обновлений и других операций. Его единственной целью является постоянное количество встречающихся значений sometext
. Это означает, что я не могу отказаться от id
и использовать sometext
в качестве ПК.
Я делаю следующее:
- Во-первых, я обращаюсь к своему собственному кешу, чтобы избежать доступа к БД. Почти всегда это работает, и я закончил.
- В противном случае я использую Hibernate Criteria, чтобы найти строку по
sometext
. Обычно это работает, и снова я закончил. - В противном случае мне нужно вставить новую строку.
Это работает нормально, за исключением случаев, когда есть два перекрывающихся запроса с одним и тем же sometext
. Затем выдается ConstraintViolationException
. Мне нужно что-то вроде INSERT IGNORE
или INSERT ... ON DUPLICATE KEY UPDATE
(синтаксис Mysql) или MERGE (Firebird синтаксис).
Интересно, какие есть варианты?
AFAIK Hibernate merge
работает только на ПК, так что это неуместно. Я предполагаю, что собственный запрос может помочь или нет, так как он может быть зафиксирован или не зафиксирован, когда происходит второй INSERT.