MySQL поддерживает синтаксис "INSERT ... ON DUPLICATE KEY UPDATE ...
", который позволяет "вслепую" вставлять в базу данных и возвращаться к обновлению существующей записи, если таковая существует.
Это полезно, если вы хотите быстро изолировать транзакцию и значения, которые хотите обновить, чтобы зависеть от значений, уже находящихся в базе данных.
Как надуманный пример, скажем, вы хотите подсчитать количество просмотров истории в блоге. Один из способов сделать это с помощью этого синтаксиса может быть:
INSERT INTO story_count (id, view_count) VALUES (12345, 1)
ON DUPLICATE KEY UPDATE set view_count = view_count + 1
Это будет более эффективным и эффективным, чем начало транзакции, и обработкой неизбежных исключений, возникающих при появлении новых историй на первой странице.
Как мы можем сделать то же самое или выполнить ту же цель с Hibernate?
Во-первых, парсер Hibernate HQL генерирует исключение, потому что он не понимает ключевые слова для конкретной базы данных. На самом деле, HQL не любит каких-либо явных вложений, если это не "INSERT ... SELECT ....
".
Во-вторых, Hibernate ограничивает SQL только выбором. Hibernate выдаст исключение, если вы попытаетесь вызвать session.createSQLQuery("sql").executeUpdate()
.
В-третьих, Hibernate saveOrUpdate
не соответствует счету в этом случае. Ваши тесты пройдут, но тогда вы получите сбои в работе, если у вас более одного посетителя в секунду.
Неужели мне нужно подорвать Hibernate?