JPA и уникальные поля - PullRequest
       25

JPA и уникальные поля

2 голосов
/ 18 июля 2010

В моем приложении есть два постоянных объекта: вещи и теги, прикрепленные к вещам. Приложение может генерировать коллекции вещей с прикрепленными тегами. Объекты тегов имеют уникальное имя (не имеет смысла отмечать что-либо дважды одним и тем же тегом).

При вставке Thing (с прикрепленными объектами тегов) некоторые из этих объектов тегов с одинаковыми именами, возможно, уже существуют в БД. Теперь вот часть, которую я не помню о JPA, есть ли способ сказать JPA, что он не должен пытаться добавить соответствующие объекты в БД, если он нарушает ограничение уникальности? Или есть способ сделать это эффективно без необходимости сначала извлекать все объекты, затем объединять коллекцию в памяти и затем записывать все обратно?

Мне также интересно, возможно ли сохранить всю коллекцию за один раз или мне нужно вызывать persist для каждого объекта при использовании JPA?

1 Ответ

1 голос
/ 18 июля 2010

Я не знаю ни одного способа сделать это «чисто», ни с JPA, ни с Hibernate, ни с каким-либо другим провайдером.Вы можете достичь желаемого с помощью пользовательского запроса SQL (хотя (как этот вопрос ):

@Entity
@Table(name="tag")
@SQLInsert( sql="INSERT INTO tag(name, count) VALUES (?, ?)
 ON DUPLICATE KEY UPDATE set count = count + 1")
public class Tag {}

Теперь вы, к сожалению, связаны как с Hibernate, так и с MySQL.Вы можете изменить синтаксис sql для других БД: и / или использовать хранимые процедуры, сначала попробовать обновить и вставить при сбое и т. Д. Все они имеют свои недостатки, поэтому было бы удобно, если бы JPA поддерживал это, но увы.

Что касается вашего второго вопроса, JPA поддерживает сохранение целых графов объектов, включая коллекции.

...