IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

Supprimer en base les objets supprimés dans une ArrayList


Sujet :

JPA Java

  1. #1
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut Supprimer en base les objets supprimés dans une ArrayList
    Bonjour,

    J'ai une entity qui contient une liste d'une autre entity
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Entity
    @Table(name = "dbo.EMP_EMPLOYE")
    public class Employe extends BusinessEntite {
     
           @OneToMany(mappedBy = "employe", fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
           private List<EmployePer> employePerList;
    }
    Est-il possible que quand j'enlève une élément EmployePer de la liste (employe.removeEmployePer(periode)) et que je fait ensuite un merge du bean Employe, un delete soit fait sur la table EmployePer pour supprimer l'élément supprimé de la liste ?
    Actuellement je fais comme le code qui suit mais je me demandais s'il n'y avait pas possibilité d'automatiser et ainsi enlever la requete m_employePerDao.deleteEmployePer(periode); pour qu'elle se fasse toute seule (JPA détecte que la liste a changé et delete automatiquement l'objet supprimé de la liste) ?

    Car dans la cas contraire, si j'ajoute un élément dans la liste, un insert dans EmployePer est fait automatiquement, sans que j'ai quoique ce soit à faire....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @Override
    	public void updateEmploye(Employe employe) {
    		List<EmployePer> lstEmpPer = new ArrayList<>(employe.getEmployePerList());
    		for (EmployePer periode : lstEmpPer) {
    			if (periode.isDeleted()) {
    				if (periode.getId() > 0) {
    					m_employePerDao.deleteEmployePer(periode);
    				}				
                                    employe.removeEmployePer(periode);
    			}
    		}
    		m_employeDao.updateEmploye(employe);
    	}
    Merci pour votre aide

  2. #2
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    Salut,
    je ne saisie pas ta question?
    L´as tu fait comme tu l´explique et cela n´a pas fait un Update comme prevu?

    Eric

  3. #3
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    Salut,

    Dans l'ordre j'ai fais :

    1. Enlever un élément de la liste (ArrayList)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    employe.removeEmployePer(periode);
    2. Fait un merge de Employe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    entityManager.merge(employe);
    => Aucune requête de mise à jour (update, delete)

    -------------------------------------------------------------------------------------

    1. Même chose mais en plus modification d'un autre champ de type String
    2. Fait un merge de Employe

    =>
    2015-07-16T13:18:42.889+0200|Précis: UPDATE dbo.EMP_EMPLOYE SET LOGIN = ?, VERSION = ? WHERE ((ID = ?) AND (VERSION = ?))
    bind => [jonas, 3, 2, 2]
    -------------------------------------------------------------------------------------
    1. Ajouter un élément à la liste (ArrayList)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    employe.addEmployePer(periode);
    2. Fait un merge de Employe

    =>
    2015-07-16T13:20:36.573+0200|Précis: INSERT INTO dbo.EMP_EMPLOYE_PER (CATEGORIE, FONCTION, PERIODE_DEBUT, PERIODE_FIN, TARIF, TARIF_2, VERSION, INT_EMPLOYE_ID, GL_SOCIETELIEU_DOMAINECOMP_ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
    bind => [null, null, 2010-01-01, 9999-12-31, 0.0, 0.0, 1, 2, 5]


    Pourquoi l'insert est implicite alors que le delete ne l'est pas ?

  4. #4
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    salut,
    parceque que tu detaches seulement periode d´un employé, donc c´est employe qui recoit une nouvelle Liste( elle peut etre null).
    mais les entités periode ne sont pas effacés de la bases de données.

    Eric

  5. #5
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Met un CascadeType.DELETE_ORPHAN pour supprimer les employés "orphelins" après le merge

  6. #6
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    Ok donc je dois bien faire les delete de periode moi-même !?

    @eulbobo : Je n'ai pas vraiment besoin de supprimer les orphelins, j'en ai pas en fait. Je voudrais automatiquement supprimer un fils sans supprimer le père

  7. #7
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    Autre cas similaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @ManyToMany
    @JoinTable(
    	name="MD_MANDAT_LOCALITE",
    	joinColumns={@JoinColumn(name="MD_MANDAT_ID", referencedColumnName="ID")},
    	inverseJoinColumns={@JoinColumn(name="AD_LOCALITE_ID", referencedColumnName="ID")})
    private List<Localite> listLocalites;
    JPA me créé automatiquement une table de lien avec l'id de mandat et l'id de localite.

    En java j'ai une table dans laquelle je peux ajouter des localités pour les affecter à un mandat. Si je veux enlever une localité d'un mandat .... je peux le faire sans faire moi-même une requete du genre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DELETE FROM MandatLocalite m WHERE m.localite = :localite

  8. #8
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    Mais si tu fais un delete d´une periode et que tu as annoté le champs CascadeType.ALL, alors il va supprimer cette periode chez tout les employés ayant cette reference.
    Sinon il va te produire une exception.

    Eric

  9. #9
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    Une période appartient à un et un seul employé. Un employé peut avoir plusieurs périodes

  10. #10
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    donc il supprimera cette Periode chez cet employé.

    eric

  11. #11
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    Désolé, je n'arrive pas à te suivre

    donc il supprimera cette Periode chez cet employé.
    Lorsque je supprime uhn employé ? Car ce n'est pas ça, je supprime juste une période d'un employé

    Sur la proporiété "listPeriode" d'employé, j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE
    mais je dois quand même faire moi-même un delete de période

  12. #12
    Membre chevronné Avatar de ruscov
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2007
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2007
    Messages : 347
    Par défaut
    Tu dois préciser orphanRemoval=true sur ta relation OneToMany.
    Cela marque l'enfant comme étant "à supprimer" quand il n'est plus référencé par le parent. Typiquement quand tu enlève un enfant de la collection du parent.

    A ne pas confondre avec le Cascade Delete qui lui supprimer les enfants quand le parent est supprimé.

  13. #13
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    AH d'accord.
    J'avais pas compris comme ça ... je pensais que orphanRemoval supprimait en base les enfants n'ayants plus de référence.
    Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment ramener les objets associés dans une projection?
    Par Wise_Sherkaan dans le forum Hibernate
    Réponses: 1
    Dernier message: 21/05/2013, 14h03
  2. Retourner les objets declaré dans une classe
    Par slix_alex dans le forum Général Java
    Réponses: 2
    Dernier message: 24/03/2011, 20h00
  3. Cibler les objets textes dans une animation
    Par Myrrdin dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 22/06/2010, 15h43
  4. Réponses: 2
    Dernier message: 23/03/2009, 14h25
  5. [CLI] Filtrer les objets modifiés dans une version Tag
    Par peaceinpal dans le forum Subversion
    Réponses: 2
    Dernier message: 27/01/2009, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo