-->
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.  [ 2 posts ] 
Author Message
 Post subject: Mapping de documents XML avec Hibernate et DOM4J
PostPosted: Fri Aug 18, 2006 10:57 am 
Newbie

Joined: Fri Aug 18, 2006 10:13 am
Posts: 10
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 ...


Top
 Profile  
 
 Post subject: [A peu près résolu] MAJ documents XML avec Hibernate et D
PostPosted: Wed Sep 20, 2006 9:06 am 
Newbie

Joined: Fri Aug 18, 2006 10:13 am
Posts: 10
je m'en suis sortie en faisant ça


/**
* @return
*/
public int update() {
int n=0;
try {
/* 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);

Node toRemove = (Node) xmldb.selectSingleNode("//r[id=\"" + this.utilisateur.getId() + "\"]");

if (toRemove != null) {
/* 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();

/* Persistance de l'objet dans la session POJO */
pojoSession.merge("wpi.metier.Utilisateur",utilisateur );
pojoSession.flush();

/* Récuperation de l'objet persisté dans un element DOM */
Element element = (Element) dom4jSession.get("wpi.metier.Utilisateur", this.utilisateur.getId() );

/* Suppression et creation respectivement de l'ancien et du nouvel element */
boolean isRemove = toRemove.getParent().remove(toRemove);

if (isRemove) {
/* Ajout du neud */
xmldb.getRootElement().add(element);

/* Ecriture physique du fichier */
XMLWriter writer = new XMLWriter(new FileWriter(xmlfile));
writer.write( xmldb );
writer.close();
n++;
}

transaction.commit();
session.close();
}
}
catch (Exception e) {
e.printStackTrace ();
}
return n;
}


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

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.