Contrainte d'hibernation ConstraintViolationException. Y at-il un moyen facile d'ignorer les entrées en double?
Au fond, j'ai le schéma ci-dessous et je suis de l'insertion d'enregistrements, si elles n'en existe pas. Cependant quand il s'agit de l'insertion d'un double de il jette et des erreurs que je m'attends. Ma question est de savoir si il existe un moyen facile de faire Hiberner à ignorer les inserts qui aurait pour effet de l'insertion de doublons?
CREATE TABLE IF NOT EXISTS `method` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
SEVERE: Duplicate entry 'GET' for key 'name'
Exception in thread "pool-11-thread-4" org.hibernate.exception.ConstraintViolationException: could not insert:
source d'informationauteur luxerama | 2010-05-23
Vous devez vous connecter pour publier un commentaire.
Comment pourrait-Hibernate connaissent peut-être qu'un document n'a pas de valeur unique, sans insertion de l'enregistrement?
Si vous faites des lots inserts et ne veulent pas reprendre l'ensemble de la transaction et de la jeter à la session en cas de
ConstraintViolationException
(c'est ce que vous devriez faire, en théorie, après qu'une exception, voir ce fil et ce réponse précédente), ma suggestion serait d'utiliser laStatelessSession
API et d'attraper leConstraintViolationException
.Hibernate ne peut pas le faire. Cependant, vous pouvez le faire vous-même. Essentiellement, il existe deux options:
La première méthode a l'inconvénient que vous êtes en contrôle de doublon sur chaque insérer lorsque la probabilité d'y être réellement un duplicata peut être faible. Celle-ci sera plus rapide pour les cas habituel où pas de doublons se produire, mais l'inconvénient est que vous devez vérifier les doublons, d'après le visage. Lorsqu'un ConstraintViolationException est jeté invalide la session en cours; cela signifie que vous aurez besoin de rincer avant de faire une recherche de doublons.
Le contrôle de doublon avant d'insérer est probablement le plus propre approche à moins qu'il y est un important problème de performance que vous avez besoin de s'inquiéter. Assurez-vous de faire la recherche et de l'insérer dans une transaction pour s'assurer que quelqu'un ne veut pas ajouter un doublon entre la recherche et de l'insertion, sinon vous obtiendrez une ConstraintViolationException.
Comme l'a dit Pascal, Hibernate ne sais pas si c'est un doublon, jusqu'à ce qu'il a été effectivement insrted.
J'ai rencontré une situation similaire avant, plusieurs discussions ont été faire des insertions dans la bd, mais certains de ces doublons. J'ai tout de capture et gracieusement à récupérer lors de l'une de ces exceptions ont été jetés.
Au lieu d'utiliser createQuery() en mode veille prolongée, l'utilisation createSQLQuery() et essayer une requête comme "REMPLACER DANS la méthode (id) values (123);"
Vous pouvez essayer d'intercepter l'exception
org.hibernate.exception.ConstraintViolationException
et d'avaler de l'exception dans votre codePar exemple:
même si vous attrapez l'exception, il peut y avoir d'autres problèmes de
Vous pouvez utiliser @SqlInsert annotation sur votre entité, d'en changer le sql, hibernate utilise pour faire de l'insertion dans la Base de données, hibernate doit actuellement être à l'aide de cette déclaration
Si vous utilisez mysql, vous pouvez utiliser le @SqlInsert déclaration de changement de l'insert sql en utilisant insert ignorer mysql déclaration
Cependant, vous devriez obtenir l'insert sql par l'activation afficher sql en mode mise en veille prolongée, puisque l'ordre des colonnes est généré par une certaine logique, et leurs docs suggèrent de cette façon.