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 :

Jpa & manytoone question sur les créations


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut Jpa & manytoone question sur les créations
    Bonjour,

    J'ai une entity appartement, et une entity immeuble et un immeuble possede plusieurs appartements.

    Pour créer un nouvel appartement dans la base je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // création de l'objet entity
    Appart a = new Appart(......);
     
    // dans la dao je fais ça
    entitymanager.persist(a);
    Mon problème, c'est si je n'ai pas en mémoire l'objet persisté Immeuble, comment je peux créer puis persister mon objet Appart ?

    J'espere que je suis clair.

    Merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par Faiche Voir le message
    Bonjour,

    J'ai une entity appartement, et une entity immeuble et un immeuble possede plusieurs appartements.

    Pour créer un nouvel appartement dans la base je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // création de l'objet entity
    Appart a = new Appart(......);
     
    // dans la dao je fais ça
    entitymanager.persist(a);
    Mon problème, c'est si je n'ai pas en mémoire l'objet persisté Immeuble, comment je peux créer puis persister mon objet Appart ?

    J'espere que je suis clair.

    Merci d'avance
    si vous n'assignez pas le champ de l'objet "appartement" qui pointe vers l'immeuble, le lien ne sera évidemment pas persisté automatiquement…

    donc si ce champ a pour contrainte de ne pouvoir être NULL : vous ne pourrez pas persister d'appartements… (vous aurez une exception lors du commit…)

    sinon vous aurez tout simplement des appartements qui n'appartiennent à aucun immeuble…


    le mieux est d'avoir l'objet immeuble en mémoire…
    et de faire les assignations correctement…

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    En fait, dans mon appli, c'est pas un appart et un immeuble, mais plutot une table centrale liée à une vingtaine d'autres tables, directement et indirectement. Je suis quasiment obligé d'avoir toute la base en mémoire pour ajouter des élements.

    Du coup, je voulais savoir s'il y avait un moyen de rendre ça simple, ou alors si je dois me taper des nativeQuery :/

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par Faiche Voir le message
    En fait, dans mon appli, c'est pas un appart et un immeuble, mais plutot une table centrale liée à une vingtaine d'autres tables, directement et indirectement. Je suis quasiment obligé d'avoir toute la base en mémoire pour ajouter des élements.

    Du coup, je voulais savoir s'il y avait un moyen de rendre ça simple, ou alors si je dois me taper des nativeQuery :/
    ça dépend beaucoup trop des détails de votre application…

    mais en général le LAZY loading sert justement à éviter de devoir charger trop de données…

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    C'est pas du chargement, mais de l'ajout.

    Je reçois un fichier xml avec un nombre aléatoire (je ne sais jamais) d'éléments à ajouter en base. Chacun de ces éléments est lié à une dizaine de table et certaines d'entre elles sont liées à d'autres etc.

    Plutot que de charger la table entière en mémoire pour lier facilement mes éléments, j'aurai préféré ajouter juste les id et ne pas me faire chier.

    Je voulais savoir si c'était possible par JPA ou si je me tapais du SQL natif.

    Pour tout ce qui est lecture et affichage genre présentation web, je sais me servir des différents types de loading et tout.

    Je me rends compte que j'aurai du dire ça depuis le début, mais je suis super fatigué, j'ai un peu du mal a me concentrer :p

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut
    En JPA tout dépend de la façon dont les entity sont liés, le mappage dans la bdd sera de toute façon faite avec les id.

    La plupart du temps il suffit de faire rechercher l'objet parent et de lui ajouter le nouvel objet. Faire attention si le nouvel objet contient une relation au parent.

    Exemple avec deux entity Parent et Fils:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Parent parent = em.find(Parent.class, idParent);
    if(parent == null) {
      // cas ou le parent n'existe pas dans la bdd
      // si besoin le créer içi ou générer une exception
    }
    Fils fils = new Fils();
    em.persist(fils);
    parent.setFils(fils);
    // si relation parent < = > Fils, n'est pas nécessaire pour la persistance dans la bdd mais est obligatoire si l'on veut travailler avec le cache de JPA sinon la relation ne fonctionne que dans un sens jusqu'à la perte de l'objet du cache et la relecture le l'objet depuis la bdd.
    fils.setParent(parent);
    JPA chargera juste la partie nécessaire des objets dans son cache pour créer les associations entre objets. Il ne chargera en aucun cas le contenu de toutes les tables.

    J'espère avoir été assez clair, sinon contacte moi par email ou MP pour plus de détails sur JPA.

Discussions similaires

  1. Question sur les méthodes play.db.jpa.Model
    Par sarazinj dans le forum Play!
    Réponses: 3
    Dernier message: 01/03/2012, 15h59
  2. Création de composants - question sur les paquets
    Par josse95 dans le forum C++Builder
    Réponses: 4
    Dernier message: 01/04/2007, 13h03
  3. question sur les droits sur un tablespace à la création
    Par black_code dans le forum Oracle
    Réponses: 6
    Dernier message: 03/12/2005, 13h13
  4. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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