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

Persistance des données Java Discussion :

Sauvergarder les fils et le Parent en un seul appel


Sujet :

Persistance des données Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2012
    Messages : 23
    Points : 25
    Points
    25
    Par défaut Sauvergarder les fils et le Parent en un seul appel
    Bonjour,

    Je souhaiterai sauvegarder le parent ainsi que ces fils un seul opération : la sauvegarde du parent

    Parent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    @javax.persistence.Table(name = "PARENT")
    @Entity
    public class PARENT {
      private Integer id;
     
      @javax.persistence.Column(name = "ID")
      @Id
      @GeneratedValue(strategy=GenerationType.AUTO)
      public Integer getId() {
        return id;
      }
     
      public void setId(Integer id) {
        this.id = id;
      }
     
      private Collection<Child> children;
     
      @OneToMany(mappedBy = "parent", fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
      @Cascade({org.hibernate.annotations.CascadeType.ALL})
      public Collection<Child> getChildren() {
        return children;
      }
     
      public void setChildren(Collection<Child> children) {
        this.children = children;
      }
    }
    Fils
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    @javax.persistence.Table(name = "CHILD")
    @Entity
    @IdClass(Child.ChildId.class)
    public class Child {
      private String childId1;
     
      @Id
      public String getChildId1() {
        return childId1;
      }
     
      public void setChildId1(String childId1) {
        this.childId1 = childId1;
      }
     
      private Parent parent;
     
      @ManyToOne
      @javax.persistence.JoinColumn(name = "PARENT_ID", referencedColumnName = "ID")
      public Parent getParent() {
        return parent;
      }}
    Maintenant j'aimerai sauvegarder en une fois du style ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Parent parent = new Parent();
     
        Child child = new Child();
        child.setChildId1("a");
        ArrayList<Child> children = new ArrayList<Child>();
        children.add(child);
     
        parent.setChildren(children);
        parent.setValue("value");
     
        parentDao.save(parent);
    D'avance merci pour votre aide

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonsoir,

    Je pense que la seule façon est de faire le save des children dans méthode du DAO avant de sauvegarder le parent.

    A+.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Bonsoir,

    En principe cascade = {CascadeType.ALL} devrait suffir pour avoir le comportement que tu veux.

    Ton problème vient du fait que quand tu ajoutes un objet child dans la liste children de l'objet parent, tu oublies de faire pointer aussi child vers l'objet parent.

    Le plus simple à faire c'est d'ajouter une méthode addChild() dans l'entité Parent qui permettrait de prendre soin des associations:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    @Table(name = "PARENT")
    @Entity
    public class Parent {
      ...
     
     
      private Collection<Child> children = new ArrayList<Child>();
     
      @OneToMany(mappedBy = "parent", fetch = FetchType.EAGER, cascade = {CascadeType.ALL}) 
      public Collection<Child> getChildren() {
        return children;
      }
     
      public void setChildren(Collection<Child> children) {
        this.children = children;
      }
     
      public void addChild(Child child) {
           this.getChildren().add(child);
           child.setParent(this);
      }
    }
    Puis dans ta classe service, il te reste simplement à faire quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Parent parent = new Parent();
    
     Child child = new Child();
     child.setChildId1("a");
    
     parent.addChild(child);
    
    ...
    
     parentDao.save(parent);
    Voilà, bon courage!
    SCJP 5 / SCBCD 1.3 Certified

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2012
    Messages : 23
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    J'ai trouvé la solution, je vais faire un poste sur un blog, et mettre le lien ici !!
    C'est juste magnifique.

  5. #5
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    Bonjour,

    Citation Envoyé par ranly Voir le message
    J'ai trouvé la solution
    Quelle est cette solution magnifique ?


    D'abord si une classe hérite d'une autre, mets peut-être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @Entity
    public class Child extends Parent {
           ...
    }
    Ensuite, si c'est du JPA, ce n'est pas la peine de mapper le parent s'il n'y a pas la table dans la base de données. Il suffit de mettre l'annotation @MappedSuperclass.

    Sinon, il faut mettre l'annoation @Inheritance(strategy = InheritanceType.[...]) sur le parent et ne rien mettre sur l'enfant à part @Entity et @Table.
    La jointure lors du select, enregistrement etc est implicite. Et dans ce cas, tu ne manipule plus que la classe enfant.
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

Discussions similaires

  1. [AJAX] Centraliser les requêtes AJAX afin d'avoir un seul appel
    Par Mike_69 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/03/2007, 16h51
  2. Requête pour compter le nombre de fils de chaque parent
    Par santana2006 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 25/08/2006, 16h08
  3. Réponses: 23
    Dernier message: 18/05/2006, 20h33
  4. [C#]Comment avoir les fils d un noeud dans 1 arbre
    Par wodel dans le forum Windows Forms
    Réponses: 6
    Dernier message: 03/04/2006, 13h42
  5. [XML] Savoir nombre d'un certain type de fils d'un parent
    Par debutanteVB.NET dans le forum Bibliothèques
    Réponses: 8
    Dernier message: 09/12/2005, 16h06

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