2017-10-15 4 views
0

J'ai un scénario très typique de relation un à plusieurs (un enregistrement de demande et avec les enregistrements de détails de la demande) qui sont récupérés via hibernate, détachés de la session, modifiés puis sauvegardé à nouveau après modification avec hibernate aussi, ... Supposons maintenant qu'un des détails de l'enregistrement est supprimé du côté client et je veux persister qu'il est supprimé (supprimer de la base de données) ... La logique actuelle fait ce qui suit (à chaque mise à jour): récupérer à nouveau tous les enregistrements esclaves, comparer l'entrée client avec les enregistrements persistants, si un enregistrement manque, cela signifie que l'appel session.delete est supprimé pour supprimer l'enregistrement désigné ... Enfin, l'entité est mis à jour session.update .... Je me demande s'il y a une autre façon de laisser le fournisseur notifier que l'enregistrement a été supprimé sans faire cela c omparison ... Toute aide?Gérer la suppression de détail dans une relation maître-détail de un à plusieurs - hibernate

Répondre

-1

vous pouvez utiliser cascade et supprimer l'option orpheline pour que votre parent change enfant d'impact comme:

@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval=true) 

Ensuite, vous devez utiliser Session.update() ou Session.merge() pour recollement des instances détachées. De cette façon, toutes les modifications que vous effectuez seront enregistrées à la fin de votre transaction (lors de la validation).

Ceci est mon exemple de code:

session.persist(a1); 
    session.flush(); 
    session.getTransaction().commit();//a1 saved 

    session.evict(a1);//a1 detached 

    a1.getTableBs().remove(0);//remove child 

    session.beginTransaction(); 
    session.update(a1);//reattach a1 
    session.flush(); 
    session.getTransaction().commit(); 

    session.close(); 

Et à la fin de ma course de mise en veille prolongée transaction requête comme ceci pour supprimer l'enfant:

Hibernate: 
delete 
from 
    TABLE_B 
where 
    ID=? 
+0

Comme je sais, la suppression Orphan ne fonctionnera pas tant que l'objet orphelin est détaché ... Donc je vais devoir relire toute l'entité à partir de la base de données ... Supprimer l'objet détail nommé puis mettre à jour ... Est-ce que c'est le même scénario –

+0

ça marche, quand vous revenez attach (à l'aide de la fusion/mise à jour) supprimera l'enfant qui a été supprimé lors de la validation. Déjà essayer ceci dans mon local pour s'assurer que cela fonctionne. – Angga

+0

Je l'ai juste essayé dans mon code, et comme prévu, cela ne fonctionne que si la suppression est faite pendant que l'entité est gérée, si la suppression est faite avant que l'entité soit gérée, elle ne sera pas reflétée dans la base de données les détails sont ajoutés mais les détails supprimés sont toujours présents dans la base de données –