Я не знаю ни одного способа сделать это «чисто», ни с 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 поддерживает сохранение целых графов объектов, включая коллекции.