2010-07-18 3 views
2

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

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

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

ответ

1

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

@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 для других БД: s и/или использовать хранимые процедуры, сначала попробовать обновление, вставить сбой и т. Д. У всех есть свои недостатки, поэтому было бы удобно, если JPA поддержат это, но, увы.

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

+0

Последний вопрос: что произойдет, если я сохраню объект, который имеет ссылку на объект, который уже сохранен и включен каскадный режим? – Nils

Смежные вопросы