Bonjour,
Sur un projet, on remplace un driver XML JDBC (Ashpool) pour requeter des documents XML en SQL, par la nouvelle fonctionnalité d'Hibernate 3.
Parcour le document XML et le peersister dans un POJO ne nous a pas trop poser de problème.
Ci-joint le code java et les fichiers de configuration Hibernate.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- properties --> <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property> <property name="hibernate.connection.url">jdbc:hsqldb:.</property> <property name="hibernate.connection.username">sa</property> <property name="hibernate.connection.password"></property> <property name="hibernate.hbm2ddl.auto">create</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.default_entity_mode">dom4j</property> <property name="dialect">org.hibernate.dialect.HSQLDialect</property> <!-- mapping files --> <mapping resource="wpi/metier/Utilisateur.hbm.xml" /> <mapping resource="wpi/metier/Contrat.hbm.xml" /> <mapping resource="wpi/metier/Evenement.hbm.xml" /> </session-factory> </hibernate-configuration>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="wpi.metier"> <class name="Utilisateur" node="r"> <id name="id" type="string" node="@id"/> <property name="nom" type="string" node="fullname"/> <property name="adresse" type="string" node="adresse"/> <property name="codepostal" type="string" node="zip"/> <property name="ville" type="string" node="city"/> <property name="telephone" type="string" node="phone"/> <property name="fax" type="string" node="fax"/> <property name="rcs" type="string" node="rcs"/> <property name="villercs" type="string" node="cityrcs"/> <property name="siret" type="string" node="siret"/> <property name="tva" type="string" node="tva"/> <property name="email" type="string" node="email"/> <property name="cabinet" type="string" node="cabinet"/> <property name="comptable" type="string" node="comptable"/> <property name="correspondant" type="string" node="correspondant"/> <property name="adressecomptable" type="string" node="adressecomptable"/> <property name="codepostalcomptable" type="string" node="zipcomptable"/> <property name="villecomptable" type="string" node="citycomptable"/> <property name="emailcomptable" type="string" node="emailcomptable"/> <property name="phonecomptable" type="string" node="phonecomptable"/> <property name="faxcomptable" type="string" node="faxcomptable"/> <property name="banque" type="string" node="banque"/> <property name="conseiller" type="string" node="conseiller"/> <property name="adressebanque" type="string" node="adressebanque"/> <property name="codepostalbanque" type="string" node="zipbanque"/> <property name="villebanque" type="string" node="citybanque"/> <property name="phonebanque" type="string" node="phonebanque"/> <property name="faxbanque" type="string" node="faxbanque"/> <property name="isEI" type="boolean" node="isEI"/> </class> </hibernate-mapping>
public Object select() {
try { /* Initialisation d'Hibernate pour le mapping DOM vers JAVA */ Session session = HibernateUtil.getSessionFactory().openSession(); Session dom4jSession = session.getSession(EntityMode.DOM4J); Session pojoSession = session.getSession(EntityMode.POJO); Transaction transaction = session.beginTransaction(); /* Lecture du document avec DOM4J */ SAXReader saxReader = new SAXReader(); String xmlfile= this.getRequest().getSession(false).getServletContext().getRealPath("/") + "ressources" + java.io.File.separator + "xml" + java.io.File.separator + "wpi-users.xml"; Document xmldb = saxReader.read(xmlfile); List users = xmldb.selectNodes("//r"); Iterator it = users.iterator(); while(it.hasNext()){ /* Persistance du noeud dans la session DOM */ Element element = (Element) it.next(); dom4jSession.merge("wpi.metier.Utilisateur", element ); String id = new String (element.attributeValue("id")); dom4jSession.flush(); /* Récuperation de l'objet persisté dans le session POJO */ Object obj = pojoSession.get(Utilisateur.class, id ); utilisateur = (Utilisateur) obj; mList.put(utilisateur.getId(), utilisateur); } transaction.commit(); session.close(); } catch (Exception e) { e.printStackTrace (); } return mList; }
Par contre, nous cherchons un exemple de code java permettant, à partir du POJO, de mettre à jour (update, insert, delete) le document XML.
Le code suivant ne fonctionne pas ;-(
public int update() { int n=0; try { /* Initialisation d'Hibernate pour le mapping DOM vers JAVA */ Session session = HibernateUtil.getSessionFactory().openSession(); Session dom4jSession = session.getSession(EntityMode.DOM4J); Session pojoSession = session.getSession(EntityMode.POJO); Transaction transaction = session.beginTransaction(); /* Lecture du document avec DOM4J */ String xmlfile= this.getRequest().getSession(false).getServletContext().getRealPath("/") + "ressources" + java.io.File.separator + "xml" + java.io.File.separator + "wpi-users.xml";
SAXReader saxReader = new SAXReader(); Document xmldb = saxReader.read(xmlfile); /* Récupération de l'Element à modifier et surtout de son Parent */ Element oldelement = (Element) xmldb.selectSingleNode("//r[@id=\"" + this.utilisateur.getId() + "\"]"); Element parent = oldelement.getParent(); /* Persistance de l'objet dans la session POJO */ pojoSession.merge("wpi.metier.Utilisateur",utilisateur ); pojoSession.flush(); /* Récuperation du POJO dans la session DOM */ Element newelement = (Element) dom4jSession.get("wpi.metier.Utilisateur", this.utilisateur.getId() ); /* Pour information ... */ mLog.info("Noeud avant la mise à jour : " + oldelement.asXML()); mLog.info("Noeud après la mise à jour : " + newelement.asXML()); /* Suppression et creation respectivement de l'ancien et du nouvel element */ if (parent.remove(oldelement)) { parent.add(newelement); SAXContentHandler saxContentHandler = new SAXContentHandler(); SAXWriter saxWriter = new SAXWriter(saxContentHandler);
saxWriter.write(xmldb); } mLog.info("Document XML complet : " + parent.asXML()); transaction.commit(); session.close(); } catch (Exception e) { e.printStackTrace (); } return n; }
Faut-il passer par une SAXWriter ? Si oui faut-il un ContentHandler dédié ?
Merci à tous ...
|