Attraper les violations de contrainte en JPA 2.0
Envisager la suite de l'entité de la classe, avec, par exemple, EclipseLink 2.0.2 - où la link
attribut n'est pas la clé primaire, mais unique, néanmoins.
@Entity
public class Profile {
@Id
private Long id;
@Column(unique = true)
private String link;
//Some more attributes and getter and setter methods
}
Lorsque j'insère des enregistrements avec un double de la valeur de la link
attribut, EclipseLink ne pas jeter un EntityExistsException
, mais jette un DatabaseException
, avec le message expliquant que la contrainte unique a été violé.
Cela ne semble pas très utile, car il n'y aurait pas une simple base de données indépendante, de façon à intercepter cette exception. Quel serait le conseillé façon de traiter ce problème?
Quelques choses que je compte sont:
- Vérifier le code d'erreur sur le
DatabaseException
- je crains que ce code d'erreur, cependant, est le natif de code d'erreur de la base de données; - Vérifier l'existence d'un
Profile
avec la valeur spécifique pourlink
à l'avance de toute évidence, cela entraînerait une énorme quantité de requêtes superflues.
J'ai soumis un bug de ce problème. Merci de voter pour lui afin que nous puissions obtenir ce problème résolu: bugs.eclipse.org/bugs/show_bug.cgi?id=375745
OriginalL'auteur wen | 2010-05-23
Vous devez vous connecter pour publier un commentaire.
Oui, et un fournisseur JPA n'est pas censé jeter un
EntityExistException
dans ce cas, vous n'obtiendrez pas uneEntityExistException
sur autre chose que la clé primaire.C'est très MAL de EclipseLink, un fournisseur JPA devriez jeter un
PersistenceException
ou une sous-classe, mais certainement pas une exception spécifique commeo.e.p.e.DatabaseException
. C'est un bug et doit être signalé en tant que tel comme je l'ai déjà mentionné dans un réponse précédente.Même réponse que ci-dessus, voir mon réponse précédente.
Peut-être que le problème est résolu dans les versions récentes, ne peut pas dire. Mais à ma connaissance, Hibernate ne jeté un
PersistenceException
dans de tels cas.OriginalL'auteur Pascal Thivent
C'est dommage qu'ils n'ont pas un ConstraintViolationException en JPA. J'ai créé une méthode d'aide à déterminer si le PersistenceException est une violation de contrainte pour une classe donnée - c'est hibernate seulement si. J'imagine que c'est une façon de le faire en utilisant d'autres implémentations.
OriginalL'auteur Brian DiCasa