0 votes

Violation d'une contrainte Hibernate/erreur de retour en arrière

J'ai rencontré une erreur étrange avec l'hibernation, très probablement due à une mauvaise utilisation de celle-ci, mais je me demandais s'il y avait un moyen d'en trouver la cause profonde et peut-être d'y remédier.

Actuellement, j'ai une hiérarchie de classes qui ressemble à ceci :

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "tbl_class_a)
public ClassA {
    ...
    private int propA;
    ...
}

@Entity 
@Table(name = "tbl_class_b")
public ClassB extends ClassA {
    ...
    @Column(unique = true)
    private int propB;
    ...
}

@Entity
@Table(name = "tbl_class_c")
public ClassC extends ClassC {
    ...
    private int propC;
    ...
}

J'ai testé de manière approfondie la persistance et la suppression d'objets des trois classes et tout semble fonctionner normalement jusqu'à ce que je considère les contraintes sur les propriétés, notamment en ce qui concerne la persistance.

Maintenant, j'instancie un objet, newObj, de la classe C qui a une valeur de propB qui est égale à un objet persistant tout prêt qui a cette valeur pour son propB. J'essaie de le persister et, comme prévu, une violation de contrainte est déclenchée et je tente d'annuler la transaction. Je m'attendrais à ce que toutes les traces de newObj soient supprimées, mais quelque chose d'extrêmement étrange se produit. Toutes les références à newObj dans les tables de la classe C et de la classe B sont effectivement supprimées, mais les propriétés de la table de la classe A restent, et pour autant que je sache, irrécupérables. Pourquoi ?

1voto

ChssPly76 Points 53452

Moteur MyISAM pour MySQL ne prend pas en charge les transactions .

Hibernate insère les lignes dans la hiérarchie "jointe" dans l'ordre - du parent à l'enfant. Ainsi :

  1. la ligne dans la table A est insérée
  2. Hibernate tente d'insérer une ligne dans la table B et échoue (la ligne n'est pas insérée).
  3. il n'y a pas de tentative d'insertion de ligne dans la table C (parce que la purge de session a échoué et qu'une exception a été levée).

Pas de transactions signifie pas de retour en arrière, donc vous vous retrouvez avec une ligne dans la table A.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X