[Débutant] Problème de clé composite
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:
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:
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:
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:
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