Bonjour à tous,

je travaille sur une application d'import / export de données depuis/vers des fichier XML.

Nous utilisons hibernate pour les connexion en base, et les librairies de dom4j pour faire les import depuis les XML.

Dans mon mapping, j'ai des clés composites et ce sont ces clés qui me pose problèmes:

voici mon mapping:
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
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="toto.mapping.Gazette" table="GAZETTE" schema="SCHEMA" entity-name="GAZETTE">
<composite-id name="id" class="toto.mapping.GazetteId">
<key-property name="nogazette" type="java.lang.Short" node="NOGAZETTE">
<column name="NOGAZETTE"/>
</key-property>
<key-property name="yygazette" type="java.lang.Short" node="YYGAZETTE">
<column name="YYGAZETTE"/>
</key-property>
</composite-id>
<property name="dtpubli" type="java.util.Date" node="DTPUBLI">
<column name="DTPUBLI" length="10"/>
</property>
<property name="stgazette" type="java.lang.Short" node="STGAZETTE">
<column name="STGAZETTE" not-null="true"/>
</property>
</class>
</hibernate-mapping>

voici un exemple de XML en entrée:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
<GAZETTE>
    <NOGAZETTE>1</NOGAZETTE>
    <YYGAZETTE>2006</YYGAZETTE>
    <DTPUBLI>2000-01-03</DTPUBLI>
    <STGAZETTE>1</STGAZETTE>
</GAZETTE>

et voici l'erreur que j'ai:
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
22
23
24
25
26
27
28
29
 
org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): GAZETTE
	at org.hibernate.id.Assigned.generate(Assigned.java:33)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:91)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
	at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
	at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
	at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:530)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:518)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:514)
	at org.epoline.soprano.datamig.operation.dataimporter.DataImporter$InsertDataElementHandler.onEnd(DataImporter.java:682)
	at org.dom4j.io.DispatchHandler.onEnd(DispatchHandler.java:202)
	at org.dom4j.io.SAXContentHandler.endElement(SAXContentHandler.java:268)
	at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
	at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
	at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
	at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at org.dom4j.io.SAXReader.read(SAXReader.java:465)
	at toto.DataImporter.importOneFile(DataImporter.java:376)
	at toto.DataImporter.execute(DataImporter.java:310)
	at toto.executeOperations(DataMig.java:171)
	at toto.main(toto.java:125)
et le code provoquant l'erreur:
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
 
Transaction tx = null;
		tx = session.beginTransaction();
		reader.resetHandlers();
		reader.addHandler("/dataset/" + currentTableName, new InsertDataElementHandler(currentTableName, session));
		try {
			reader.read(new InputSource(input_path));
 
		} catch (DocumentException e) {
			logTableCounters(session);
			log.error(e.getMessage(), e);
		} catch (Exception e) {
			logTableCounters(session);
			log.error(e.getMessage(), e);
		}
Si quelqu'un a une piste...

Merci d'avance pour votre aide