Bonjour, j'ai un soucis de delete qui ne veut pas s'effectuer, voici mon cas :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
class entityA {
@OneToMany(mappedBy = "entityA", cascade = {CascadeType.ALL }, fetch = FetchType.LAZY)
private Set<EntityB> listeB = new HashSet<EntityB>();
....
}
class EntityB {
@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH })
@JoinColumn(name = "entityA_fk")
private EntityA entityA;
@ManyToOne(cascade = {CascadeType.ALL })
@JoinColumn(name = "entityC_fk")
@org.hibernate.annotations.Cascade (org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private EntityC entityC;
@ManyToOne(cascade = {CascadeType.ALL })
@JoinColumn(name = "entityD_fk")
@org.hibernate.annotations.Cascade (org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private EntityD entityD;
...
}
class entityC {
@OneToMany(fetch = FetchType.LAZY, mappedBy = "entityC")
private Set<EntityB> listeB;
...
}
class entityD {
@OneToMany(fetch = FetchType.LAZY, mappedBy = "entityD")
private Set<EntityB> listeB;
...
} |
en insertion j'effectue l'opération suivante:
lorsque mon entity A est persisté cela persiste toutes les relations.
donc en traitement :
==== Début transaction ====
EntityA a= new EntityA();
...
EntityB b= new EntityB();
...
EntityC c = new EntityC();
...
EntityD d = new entityD();
...
b.setEntityC(c);
b.setEntityD(d);
a.setEntityB(b);
...
EntityADao.persist(a);
==== Fin transaction ====
Et ma persistence se passe bien, tous les entity sont créé automatiquement en cascade. (Au départ j'avais une relation unidirectionnelle de entityB vers Entityc et EntityD, mais j'ai toujours la même erreur).
Donc lors d'un delete j'ai le problème suivant :
Cannot delete or update a parent row: a foreign key constraint fails (`jsarapis/EntityB`, CONSTRAINT `FK18C474728849981A` FOREIGN KEY (`entityC_fk`) REFERENCES `EntityC` (`id`))
et pour mon opération de suppression j'effectue ces étapes :
==== Début transaction ====
Collection<EntityB> col = a.getListeB();
je parcours ma liste jusqu'à ce que je trouve e, l'entityB à supprimer, boucle foreach
EntityBDao.remove(e);
....
EntityADao.merge(a)
==== Fin transaction ====
cela me retourne l'erreur vu précédemment...
J'ai pensé que le problème pouvait être que pour les liens entre e et les entity en relation C et D, ces C et D peuvent être liés à d'autre entityB. J'ai alors essayé de faire un remove des getListeB() des entityC et D concernés.
en procédant ainsi :
==== Début transaction ====
Collection<EntityB> col = a.getListeB();
je parcours ma liste jusqu'à ce que je trouve e, l'entityB à supprimer, boucle foreach
e.getEntityD().getListeB().remove(e);
e.getEntityC().getListeB.remove(e);
EntityBDao.remove(e);
EntityADao.merge(a)
==== Fin transaction ====
Mais là j'obtiens cette erreur :
deleted entity passed to persist: [org.project.EntityD#<null>]; nested exception is javax.persistence.EntityNotFoundException: deleted entity passed to persist: [org.project.EntityD#<null>]
Exception in thread "main" org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
Quelqu'un aurait une idée par rapport à cela ? Je butte sur ce problème depuis un peu trop de temps...
Partager