-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Mapping xml et relation many-to-one
PostPosted: Fri Jun 05, 2009 10:53 am 
Newbie

Joined: Fri Jun 05, 2009 10:16 am
Posts: 1
Bonjour.

Après avoir cherché sur de nombreux forums et fait pas mal de tests je me résigne à solliciter votre aide car je sèche complètement.

Je suis parti du chapitre 18 de la doc Hibernate sur le Mapping XML, pour essayer depuis un fichier XML d'insérer en base des enregistrements. Je trouvais l'exemple bien fait car il y a une relation many-to-one, parfait.

J'ai repris le code fourni dans la doc et testé avec un fichier xml contenant 2 entités Customer à sauvegarder, comprenant chacune 2 sous-entités Account.

Quand je récupère le contenu de mon fichier via le SAXBuilder dans un Document et que je cherche à faire un save sur ma liste d'éléments Customer retournée par une requête XPATH via un selectNodes, ces derniers sont bien sauvegardés, par contre, les sous entités Account ne sont pas présentes.

Pour essayer de sauvegarder mes Account j'ai essayé pour chaque entité Element de type Customer de récupérer les sous Element Account puis de les sauvargder, ça ça marche.

Mais j'aimerai savoir s'il n'est pas possible de faire directement quelque chose comme ça :
Code:
session = HibernateUtilDom4J.currentSession();
         tx = session.beginTransaction();
         SAXReader sreader = new SAXReader(false);
         Document doc = sreader.read(new File("xml/listeCustomers.xml"));         
         List customers = doc.selectNodes("//customer");         
         
         for(Iterator ite = customers.iterator(); ite.hasNext();)
         {
            Element elt = (Element)ite.next();
            session.replicate(Customer.class.getName(), elt,ReplicationMode.OVERWRITE);
            
         }


Pour avoir à la fois les Customer et les Account liés sauvegardés d'un coup.

D'avance merci pour votre aide.

PS : voici mes différents source

le xml de mes données
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<liste>
   <customer id="123456789001">
      <account short-desc="Savings" id="987632567001">120.0</account>
      <account short-desc="Credit Card" id="985612323001">250.5</account>
      <name>
         <first-name>Gavin</first-name>
         <initial>A</initial>
         <last-name>King</last-name>
      </name>
   </customer>
      <customer id="123456789002">
      <account short-desc="Ristourne" id="987632567002">300</account>
      <account short-desc="Cash" id="985612323002">450</account>
      <name>
         <first-name>Niko</first-name>
         <initial>KG</initial>
         <last-name>King 1er</last-name>
      </name>
   </customer>
</liste>


le fichier de mapping Customer
Code:
<?xml version="1.0"?>
<hibernate-mapping package="org.hibernate.tutorial.domain">
   <class name="Customer" table="CUSTOMER" node="customer">
      <id name="id" column="CUST_ID" node="@id"/>
      <map name="accounts" node="." embed-xml="false" cascade="save-update" inverse="true">
         <key column="CUSTOMER_ID" not-null="true" update="true"/>
         <map-key column="SHORT_DESC" node="@short-desc"   type="string"/>
         <one-to-many class="org.hibernate.tutorial.domain.Account" embed-xml="false" node="account"/>
      </map>
      <component name="name" node="name">
         <property name="firstName" node="first-name"/>
         <property name="initial" node="initial"/>
         <property name="lastName" node="last-name"/>
      </component>
   </class>

</hibernate-mapping>


le fichier de mapping Account
Code:
<hibernate-mapping package="org.hibernate.tutorial.domain">
   <class name="Account" table="ACCOUNTS" node="account">
      <id name="id" column="ACCOUNT_ID" node="@id" type="string"/>
      
      <many-to-one name="customerId" column="CUSTOMER_ID" update="true" node="../@id" embed-xml="false" class="org.hibernate.tutorial.domain.Customer"/>
      <property name="balance" column="BALANCE" node="." type="big_decimal"/>
      <property name="desc" column="SHORT_DESC" node="@short-desc" type="string"/>      
   </class>
</hibernate-mapping>


mon POJO Customer
Code:
package org.hibernate.tutorial.domain;

import java.util.Map;

public class Customer {
   
   private Long id;
   private Map accounts;
   private Name name;
   

   public Customer()
   {      
   }
   
   public Long getId() {
      return id;
   }
   public void setId(Long id) {
      this.id = id;
   }
   public Map getAccounts() {
      return accounts;
   }
   public void setAccounts(Map accounts) {
      this.accounts = accounts;
   }
   public Name getName() {
      return name;
   }

   public void setName(Name name) {
      this.name = name;
   }

}



mon POJO Acount
Code:
package org.hibernate.tutorial.domain;

import java.util.Set;

public class Account {
   
   private String id;
   private Long balance;
   private Long customerId;
   private String desc;
   
   public Account()
   {      
   }
   
   public String getId() {
      return id;
   }
   public void setId(String id) {
      this.id = id;
   }
   public Long getBalance() {
      return balance;
   }
   public void setBalance(Long balance) {
      this.balance = balance;
   }
   
   public Long getCustomerId() {
      return customerId;
   }
   public void setCustomerId(Long customerId) {
      this.customerId = customerId;
   }

   public String getDesc() {
      return desc;
   }

   public void setDesc(String desc) {
      this.desc = desc;
   }
   
   
   

}


Ma classe d'exécution
Code:
public class EventManager {
   
   public static void main(String[] args)
   {
      try
      {
         EventManager mgr = new EventManager();
         
         if(args[0].equals("xml"))
         {
            mgr.xmlMap();
         }
         else if(args[0].equals("xmlInsert"))
         {
            mgr.xmlInsert();
         }
      }
      catch(Exception e)
      {
         System.out.println("Erreur = "+ e.toString());
      }
      finally
      {
         
      }
   }
   private void xmlMap()
   {
      Session session = HibernateUtilDom4J.currentSession();
      Transaction tx = session.beginTransaction();
      
      
      DocumentFactory docFactory = DocumentFactory.getInstance();
      
      Document doc = docFactory.createDocument();
      doc.setXMLEncoding("ISO-8859-1");
      
      /*List result = session.createQuery("from Customer c left join " +
                     " fetch c.accounts " +
                     "where c.name.lastName like :name.lastName").list();*/
      
      List result = session.createQuery("from Customer c").list();
      Element root = doc.addElement("Test");
      
      for(int i=0; i < result.size(); i++)
      {
         Element customer = (Element)result.get(i);
         root.add(customer);
      }
      
      System.out.println("Result = " + doc.asXML());
      
      session.flush();
      HibernateUtilDom4J.closeSession();
   }
   
   private void xmlInsert()
   {
      Session session = null;      
      Transaction tx = null;
      try
      {

         session = HibernateUtilDom4J.currentSession();
         tx = session.beginTransaction();
         SAXReader sreader = new SAXReader(false);
         Document doc = sreader.read(new File("D:/dbo/eclipse3_4/workspace/Test/xml/listeCustomers.xml"));         
         List customers = doc.selectNodes("//customer");
         System.out.println("********Class =" + customers.size());
         
         for(Iterator ite = customers.iterator(); ite.hasNext();)
         {
            Element elt = (Element)ite.next();
            System.out.println("elt = " + elt.asXML());
            session.replicate(Customer.class.getName(), elt,ReplicationMode.OVERWRITE);
            
         }
      
      }
      catch(Exception e)
      {
         System.out.println("Exception e = " + e.toString());
      }
      finally
      {
         if(session!=null)
            session.flush();
         if(tx!=null)
            tx.commit();
         HibernateUtilDom4J.closeSession();
      }      
   }
   

}



Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.