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

Hibernate Java Discussion :

[Hibernate] remplir une classes association


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut [Hibernate] remplir une classes association
    voila, g un classe association ProduitDeCommande entre 2 classes Produit & Commande

    Pour sauver une commande, jusqu'a maintenant, je cree un objet commande que je sauve, puis je cree le ProduitDeCommande en y mettant la référence vers la nouvelle commande, puis je sauve un a un les produitDeCommanede

    Est ce qu'il ya une autre solution, + simple, dans laquelle, par exemple, je pourait créer la commande puis y insérer la liste des ProduitDeCommande rattaché, et juste sauver la commande pour que tous les changements soient pris en compte?

    c juste pour me faire une idée!

  2. #2
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Tu peux nous en dire un peu plus ?
    Par exemple, j'imagine que Commande contient une collection de ProduitDeCommande, mais ProduitDeCommande tu le considères comme un Component ? Produit a t'il une association vers une collection de ProduitDeCommande ? ProduitDeCommande référence t'il Commande (la relation est elle bidirectionnelle?) ?
    As tu un mapping a nous montrer ?

  3. #3
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Essaie eventuellement ca, je sais pas si ca ira, je ne comprends pas trop le problème :
    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
    public class Commande {
    ...
        public void addProduitDeCommande(Produit produit) {
            this.getProduitsCde().add(new ProduitDeCommande(this, produit, 1));
        }
    ...
    }
     
    public class ProduitDeCommande {
    ...
        public ProduitDeCommande() {
        }
     
        public ProduitDeCommande(Commande cde, Produit prod, int qte) {
            this();
            this.commande = cde;
            this.produit = prod;
            this.quantite = qte;
        }
    ...
    }
    Si ton objet commande est persistant, les objets que tu vas insérer dans la collection seront automatiquement sauvés. Pas d'appel explicite à faire.

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut
    g choisit de ne pas faire de lien de produit vers produitDeCommande (g peur de je sais pas koi, g suremetn tort)

    mappping de produitCommande:
    <class name="ProduitCmde" table="PRODUIT_COMMANDE">

    <composite-id >
    <key-many-to-one name="commande" class="Commande" column="refCommande" />
    <key-many-to-one name="produit" class="Produit" column="refProduit" />
    </composite-id>

    <property name="qte" type="int" >
    <column name="qteProduit_Commande" sql-type="int(11)" not-null="true"/>
    </property>
    <property name="prix" type="int" >
    <column name="prixProduit_Commande" sql-type="int(11)" not-null="true"/>
    </property>



    </class>



    et comma;de
    <class name="Commande" table="COMMANDE">

    <id name="numCommande" type="int" unsaved-value="null" >
    <column name="numCommande" sql-type="int(11)" not-null="true"/>
    <generator class="increment" />
    </id>


    <property name="dateCommande" type="date" >
    <column name="dateCommande" sql-type="date" not-null="false"/>
    </property>


    <many-to-one name="client" column="refClient" class="Client" />

    <!-- AVANT = composite element
    <set name="listProduit" table="PRODUIT_COMMANDE" lazy="true">
    <key column="refCommande" />
    <composite-element class="model.ProduitCmde">
    <property name="qte" column="qteProduit_commande" />
    <property name="prix" column="prixProduit_commande"/>
    <many-to-one class="model.Produit" name="produit" column="refProduit" outer-join="true" />
    </composite-element>
    </set>
    -->

    <!-- APRES -->
    <set name="listProduit" table="PRODUIT_COMMANDE" lazy="true" inverse="true" >
    <key column="refCommande" />
    <one-to-many class="ProduitCmde" />
    </set>

    Pour l'histoire du Component, je n'ai pas compris l'utilité par rapport aux entités

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut
    sinon je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    createCommande(Client c, ProduitComde> pc){
    cmd = new Commande();
                cmd.setClient(client);
                cmd.setDateCommande(new Date());
                session.save(cmd);
                for (ProduitCmde pc : panier ){
                    pc.setCommande(cmd);
                    session.save(pc);
                }
                cmd.setListProduit(panier);

  6. #6
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Tu devrais faire quelque chose comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public Commande createCommande(Client c, ProduitComde> pc){
    cmd = new Commande();
                cmd.setClient(client);
                cmd.setDateCommande(new Date());
                commandeDAO.save(cmd);
                for (ProduitCmde pc : panier ){
                    pc.setCommande(cmd);
                    //session.save(pc); Il n'est pas nécessaire de faire d'appel à save
                }
                cmd.setListProduit(panier); 
                ...
    Une autre manière de le 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
    15
    16
    public Commande createCommande(Client c, ProduitComde> pc){
    cmd = new Commande();
                cmd.setClient(client);
                cmd.setDateCommande(new Date());
                commandeDAO.save(cmd);
                for (ProduitCmde pc : panier ){
                    cmd.addProduitCmde(panier);
                }
                ...
     
    avec :
     
    public void addProduitCmde(ProduitComde pc) {
        pc.setCommande(this);
        this.getListProduit().add(pc);
    }

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut
    salut

    salut, la 1er solution sans le save(cp) ne me sauve que la commande

    pour la 2eme sol, c celle que me convient le mieux, le probleme c comment initialiser ce Set, vu que c pas un java.util.Set...
    En effet quand je fais set.add(pc)... dans commande, le set n'est pas créee automatiquement par Hibernate

    Comment faut il l'initialiser?

  8. #8
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Je te prends un exemple issue de la doc hibernate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Cat cat = new DomesticCat();
    Cat kitten = new DomesticCat();
    ....
    Set kittens = new HashSet();
    kittens.add(kitten);
    cat.setKittens(kittens);
    session.save(cat);
    kittens = cat.getKittens(); //Okay, la collection kittens est un Set
    (HashSet) cat.getKittens(); //Erreur !
    Est ce que ca répond à ta question ?

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut
    nan c curieux mais ca marche pas, meme apres l'initialisation correcte de la commande avec les produit_commande et les bonnes référances .

    Je pensais que ca viendrai peut etre t du mapping de produit_commande dans lkequel g 2 clés comosite many to one
    donc g rajouté dasn produit_commande:
    ..
    <many-to-one name="produit" class="Produit" column="refProduit"
    insert="false"
    update="false"
    />
    <many-to-one name="commande" class="Commande" column="refCommande"
    insert="false"
    update="false"
    />
    ..
    mais ca ne regle pas le probleme: pas d'insertion tant que je ne fais pas explicitement un save sur chaque produit_commande

    Est parce que c une entité et pas un composant?

  10. #10
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Si tu enleves inverse=true dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <set name="listProduit" table="PRODUIT_COMMANDE" lazy="true" inverse="true" >
    ca te donne quoi ? Normalement ca devrait marcher.

  11. #11
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Ca doit ressembler un peu à ton problème non ?
    http://www.hibernate.org/hib_docs/re...erorderproduct

  12. #12
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut
    nan ca marche pas:
    il veut faire un update pour chaque produit_commande (pkoi pas un insert?)
    et au moment de flusher la session (et de lancer le batch update), il plante:

    Hibernate: update PRODUIT_COMMANDE set refCommande=? where refCommande=? and refProduit=?
    15:16:19,788 DEBUG IntegerType:59 - binding '105' to parameter: 1
    15:16:19,788 DEBUG Cascades:588 - id unsaved-value strategy UNDEFINED
    15:16:19,788 DEBUG IntegerType:59 - binding '105' to parameter: 2
    15:16:19,804 DEBUG IntegerType:59 - binding '26' to parameter: 3
    15:16:19,804 DEBUG AbstractBatcher:27 - Adding to batch
    15:16:19,804 DEBUG AbstractCollectionPersister:922 - done inserting collection: 3 rows inserted
    15:16:19,804 DEBUG AbstractBatcher:54 - Executing batch size: 3
    15:16:19,819 ERROR AbstractBatcher:60 - Exception executing batch:
    org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
    at org.hibernate.jdbc.BatchingBatcher.checkRowCount(BatchingBatcher.java:92)
    at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:78)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:174)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:226)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)
    at dao.hibernate.CommandeDAOHib.createCommande(CommandeDAOHib.java:218)
    at logic.CommandeBLImpl.createCommande(CommandeBLImpl.java:63)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:288)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:57)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174)
    at $Proxy5.createCommande(Unknown Source)
    at web.action.AchatController.commander(AchatController.java:110)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
    at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:172)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
    at java.lang.Thread.run(Thread.java:595)
    je croyais avoir réglé ce probleme i l y a quelque temps mais non!

  13. #13
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Tu peux t'inspirer du lien que je t'ai donné.
    L'utilisation d'un composant peut se justifier dans le mesure où le cycle de vie de ton produit_commande dépend très fortement de celui de la commande.

  14. #14
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 186
    Par défaut
    bon c résolu en passant en composant
    je sais pa pkoi
    en tout cas je trouve pas ca trs joli un composant, mais bon la beauté c sujectif


    merci du coup de main

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

Discussions similaires

  1. Implémenter une "classe-Association".
    Par oxyaxion dans le forum Diagrammes de Classes
    Réponses: 2
    Dernier message: 02/06/2011, 18h28
  2. Création d'une Classe-association
    Par Albat90 dans le forum Diagrammes de Classes
    Réponses: 0
    Dernier message: 10/12/2009, 16h52
  3. [hibernate]Problème mapping classe association
    Par jsl1 dans le forum Hibernate
    Réponses: 6
    Dernier message: 16/06/2006, 17h27
  4. [Hibernate] Mapper une classe association
    Par mauvais_karma dans le forum Hibernate
    Réponses: 16
    Dernier message: 25/01/2006, 12h34
  5. Réponses: 10
    Dernier message: 10/01/2006, 14h14

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