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éesCode:
<?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 CustomerCode:
<?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 AccountCode:
<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 CustomerCode:
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 AcountCode:
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écutionCode:
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();
}
}
}