2010-07-18 44 views
2

J'ai deux objets de persistance dans mon application: Choses et étiquettes attachées aux choses. L'application peut générer des collections de choses avec des balises attachées. Les objets d'étiquette ont un nom unique (cela n'a pas de sens de marquer deux fois quelque chose avec la même étiquette).JPA et champs uniques

Lors de l'insertion d'une chose (avec des objets d'étiquette attachés), certains de ces objets d'étiquette ayant le même nom peuvent déjà exister dans la base de données. Maintenant, voici la partie que je ne me souviens pas de JPA, y a-t-il un moyen de dire à JPA qu'il ne devrait pas essayer d'ajouter les objets correspondants à la base de données si elle viole la contrainte unique? Ou y a-t-il un moyen de le faire efficacement sans avoir d'abord chercher tous les objets, puis fusionner la collection en mémoire et ensuite tout écrire en arrière?

Je me demande aussi s'il est possible de conserver toute une collection en même temps ou dois-je appeler persist pour chaque objet lorsque j'utilise JPA?

Répondre

1

Je ne connais aucun moyen de le faire «proprement», ni avec JPA ni avec Hibernate ou tout autre fournisseur. Vous pouvez obtenir ce que vous voulez avec une requête SQL personnalisée si (similaire à 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 {} 

Maintenant, vous êtes malheureusement lié à la fois Hibernate et MySQL. Vous pouvez modifier la syntaxe sql pour d'autres DB: et/ou utiliser des procédures stockées, essayer d'abord une mise à jour et l'insérer en cas d'échec, etc. Ils ont tous leurs inconvénients, donc ce serait pratique si JPA supportait cela, mais hélas. En ce qui concerne votre seconde question, JPA supporte les graphes d'objets entiers persistants, y compris les collections.

+0

Une dernière question: Que se passe-t-il si je persiste un objet qui a une référence à un objet déjà persistant et qui est en cascade? – Nils