Уникальные ограничения и Hibernate - PullRequest
2 голосов
/ 11 декабря 2011

Я работаю с Hibernate 3.6.4 и MySQL.
У меня есть таблица с уникальными ограничениями на четыре столбца и 3 других столбца. Когда приложение пользовательского интерфейса создает новые экземпляры соответствующего объекта, оно может создавать его с этими четырьмя свойствами, значения которых уже находятся в таблице. результат при сохранении, конечно, исключение JDBC для повторяющейся записи.

Есть ли способ сказать Hibernate не вставлять новую запись, а обновлять оставшиеся три столбца или при каждом сохранении мне нужно вручную запросить базу данных, чтобы увидеть, существуют ли и обновить ли соответственно?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 11 декабря 2011

Подход clean и независимый от базы данных подход к этой проблеме заключается в том, чтобы сначала проверить, существует ли такой экземпляр, и в зависимости от этого выполнить вставку или обновление в логике вашего приложения.

Тем не менее, может быть способ воспользоваться преимуществами MySQL INSERT ... ON DUPLICATE KEY UPDATE, описанными здесь здесь . В этом случае вы должны указать собственный оператор SQL INSERT для вашей сущности, как описано в этом связанном вопросе . Но если это работает, зависит от того, как ваши идентификаторы сущности генерируются для начала. Посмотрите эту статью в блоге , касающуюся этой проблемы.

Как правило, вы должны иметь дело со всеми аспектами проблемы, которые Hibernate считает временным экземпляром, который сохраняется, хотя фактически постоянный экземпляр обновляется. Это может быть проблемой с сгенерированными идентификаторами сущностей, другими значениями сгенерированных сущностей, версиями сущностей, параллелизмом, ожидаемым количеством строк вставки / обновления, 2-го уровня и кешем запросов и т. Д.

Итак, я думаю, что было бы неплохо поэкспериментировать с этим, я бы определенно не использовал эту функцию в производственном приложении.

1 голос
/ 11 декабря 2011

Вы действительно должны явно получить сущность с четырьмя уникальными значениями, а затем обновить ее, если она существует, или создать новую, если ее нет. Обойти это невозможно.

Кстати, обратите внимание, что даже при таком механизме вы можете получить исключения, если две транзакции одновременно получают сущность, обнаруживают, что она не существует, и обе пытаются создать новую.

...