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 actif
    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
    Points : 270
    Points
    270
    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 chevronné 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
    Points : 2 120
    Points
    2 120
    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 actif
    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
    Points : 270
    Points
    270
    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 chevronné 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
    Points : 2 120
    Points
    2 120
    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 chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Met un CascadeType.DELETE_ORPHAN pour supprimer les employés "orphelins" après le merge
    Je ne suis pas mort, j'ai du travail !

  6. #6
    Membre actif
    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
    Points : 270
    Points
    270
    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 actif
    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
    Points : 270
    Points
    270
    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 chevronné 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
    Points : 2 120
    Points
    2 120
    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 actif
    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
    Points : 270
    Points
    270
    Par défaut
    Une période appartient à un et un seul employé. Un employé peut avoir plusieurs périodes

  10. #10
    Membre chevronné 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
    Points : 2 120
    Points
    2 120
    Par défaut
    donc il supprimera cette Periode chez cet employé.

    eric

  11. #11
    Membre actif
    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
    Points : 270
    Points
    270
    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 confirmé 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 : 39
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 347
    Points : 500
    Points
    500
    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é.
    Mes logiciels n’ont jamais de bug. Ils développent juste certaines fonctions aléatoires.

  13. #13
    Membre actif
    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
    Points : 270
    Points
    270
    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, 13h03
  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, 19h00
  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, 14h43
  4. Réponses: 2
    Dernier message: 23/03/2009, 13h25
  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, 10h28

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