Я использую Hibernate 4.3.6 Final и MySQL 5.5.37.Как проверить, существует ли запись перед вставкой
Предположим, у меня есть две таблицы Book
и Words
и некоторый код, который анализирует слова в книге и добавляет их в таблицу Words
. Будут, конечно, слова, которые появляются в более чем одной книге. Тем не менее, я не хочу новую запись для слова, если она уже находится в базе данных. Вопрос только в том, что Hibernate достаточно умен, чтобы иметь какую-то функциональность для этого?
Есть несколько решений, но ни один из них не очень:
- Проверка перед созданием любого
Word
объекта, если уже есть один, как это в базе данных. Ужасно для производительности. - Поймать исключение, которое бросается при попытке вставить дубликат и обработать его. Ужасная практика.
- Имейте какой-то статический указатель слов в базе данных, который периодически обновляется и ищет слово в списке. Возможно, немного быстрее, но все еще ужасно с точки зрения производительности и памяти.
Есть ли лучший подход?
Хотя я понимаю нелюбовь с помощью обработки исключений в качестве логической функции, данный экземпляр вполне приемлемым для этого, и # 2 - ваш лучший выбор. В этом случае вы будете использовать функциональность уникального индекса в своей таблице Words и игнорируете любое исключение, которое оно выбрасывает. –
Это то, что мне тоже хотелось бы попробовать, но я использую DAO для сохранения всех моих объектов в базе данных. Это означает, что я использую один класс для общих операций с БД, что, в свою очередь, означает, что мне придется писать специальный случай для конкретного случая в общем классе. Как-то это кажется очень неправильным. – cgf