[Mapping O/R][JPOX] Mapping relation N-M et maps ...
Bonjour tout le monde,
Je travaille actuellement sur les frameworks de persistance et plus particulierement sur un exemple qui met en oeuvre JPOX.
Mon modele objet ressemble grossierement a celui ci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
Abstract Proposition {
...
HashMap assures;
Type_Proposition type_proposition;
}
Assure {
...
HashMap propositions;
}
Contrat extends Proposition {
Date date_signature;
}
Devis extends Proposition {}
Type_proposition{...} |
J'aimerai mapper cet exemple et ajoutant (pour le test) des données en base, j'ai toutefois un probleme qui vient visiblementy du mapping.
Voici le fichier package.jdo, servant au mapping O/R :
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE jdo PUBLIC
"-//Sun Microsystems, Inc.//DTD Java Data Objects Metadata 2.0//EN"
"http://java.sun.com/dtd/jdo_2_0.dtd">
<jdo>
<package name="com.contrat">
<class name="Assure" table="assure">
<field name="id_assure" primary-key="true" column="id_assure" value-strategy="autoassign" />
<field name="nom_assure" column="nom_assure" />
<field name="prenom_assure" column="prenom_assure" />
<!--Map(String,Proposition)-->
<field name="propositions" table="concerne">
<map key-type="java.lang.String" value-type="com.contrat.Proposition"/>
<join>
<column name="id_assure"/>
</join>
<element>
<column name="police"/>
</element>
</field>
</class>
<class name="Proposition" table="proposition">
<!--inheritance, abstract class-->
<inheritance strategy="new table">
<discriminator strategy="class-name">
<column name="nature_document"/>
</discriminator>
</inheritance>
<field name="police" column="police" primary-key="true" value-strategy="autoassign"/>
<field name="montant" column="montant" />
<!-- champ de type Type_Proposition-->
<field name="type_Proposition" column="type_proposition" />
<!--champ de type map(String,Assure)-->
<field name="assures" mapped-by="propositions">
<map key-type="java.lang.String" value-type="com.contrat.Assure"/>
</field>
</class>
<class name="Contrat" persistence-capable-superclass="com.contrat.Proposition">
<!--superclass inheritance-->
<inheritance strategy="superclass-table">
<discriminator value="Contrat" />
</inheritance>
<field name="date_signature" column="date_signature" />
</class>
<class name="Devis" persistence-capable-superclass="com.contrat.Proposition">
<!--superclass inheritance-->
<inheritance strategy="superclass-table">
<discriminator value="Devis" />
</inheritance>
</class>
<class name="Type_Proposition" table="type_proposition">
<field name="id_type" column="id_type" primary-key="true" value-strategy="autoassign"/>
<field name="libelle_type" column="libelle_type" />
</class>
</package>
</jdo> |
Je parviens, avec ce fichier a enregistrer des Type_Proposition, des assurés sans Proposition, mais lorsque je veux ajouter des propositions, j'obtiens l'erreur suivante (issue du log de JPOX):
Citation:
4953 [main] INFO JPOX.RDBMS.SCHEMA - Managing Persistence of Class : com.macif.contrat.simplifie.Contrat [Table : `PROPOSITION`, InheritanceStrategy : superclass-table]
4968 [main] DEBUG JPOX.RDBMS.SQL - INSERT INTO `JPOX_TABLES` (`CLASS_NAME`,`TABLE_NAME`,`TYPE`,`OWNER`,`VERSION`) VALUES (?,?,?,?,?)
5062 [main] DEBUG JPOX.RDBMS.SQL - Execution Time = 94 ms
5062 [main] DEBUG JPOX.RDBMS - Table `PROPOSITION` will manage the persistence of the fields for class com.macif.contrat.simplifie.Contrat (inheritance strategy="superclass-table")
5062 [main] DEBUG JPOX.RDBMS - Column "`PROPOSITION`.`DATE_SIGNATURE`" added to internal representation of table.
5062 [main] DEBUG JPOX.RDBMS - Field [com.macif.contrat.simplifie.Contrat.date_signature] -> Column(s) [`PROPOSITION`.`DATE_SIGNATURE`]
5078 [main] DEBUG JPOX.RDBMS.SCHEMA - Column info loaded for Catalog "test", Schema "", 4 tables, time = 0 ms
5078 [main] DEBUG JPOX.RDBMS.SCHEMA - Column info retrieved for table "`PROPOSITION`" : 5 columns found
5093 [main] DEBUG JPOX.RDBMS.SCHEMA - An error occurred while auto-creating schema elements - rolling back
5093 [main] DEBUG JPOX.RDBMS.SQL - DELETE FROM `JPOX_TABLES` WHERE `CLASS_NAME`=?
5109 [main] DEBUG JPOX.RDBMS.SQL - Execution Time = 16 ms
5109 [main] ERROR JPOX.JDO - org.jpox.store.exceptions.MissingColumnException: Required columns missing from table "`PROPOSITION`" : `ASSURES`. Perhaps your MetaData is incorrect, or you havent enabled "org.jpox.autoCreateColumns".
Exception in thread "main" org.jpox.store.exceptions.MissingColumnException: Required columns missing from table "`PROPOSITION`" : `ASSURES`. Perhaps your MetaData is incorrect, or you havent enabled "org.jpox.autoCreateColumns".
at org.jpox.store.rdbms.table.TableImpl.validateColumns(TableImpl.java:259)
at org.jpox.store.rdbms.RDBMSManager$ClassAdder.addClassTablesAndValidate(RDBMSManager.java:2454)
at org.jpox.store.rdbms.RDBMSManager$ClassAdder.run(RDBMSManager.java:2003)
at org.jpox.store.rdbms.RDBMSManager$MgmtTransaction.execute(RDBMSManager.java:1859)
at org.jpox.store.rdbms.RDBMSManager.addClasses(RDBMSManager.java:553)
at org.jpox.store.rdbms.RDBMSManager.addClass(RDBMSManager.java:567)
at org.jpox.store.StoreManager.getSubClassesForClass(StoreManager.java:867)
at org.jpox.store.query.UnionIteratorStatement.getQueryStatement(UnionIteratorStatement.java:234)
at org.jpox.store.rdbms.scostore.MapValueSetStore.getIteratorStatement(MapValueSetStore.java:213)
at org.jpox.store.rdbms.scostore.AbstractSetStore.iterator(AbstractSetStore.java:93)
at org.jpox.sco.SCOUtils.populateMapDelegateWithStoreData(SCOUtils.java:794)
at org.jpox.sco.HashMap.loadFromStore(HashMap.java:796)
at org.jpox.sco.HashMap.entrySet(HashMap.java:531)
at org.jpox.sco.HashMap.runReachability(HashMap.java:283)
at org.jpox.state.StateManagerImpl.runReachability(StateManagerImpl.java:3222)
at org.jpox.AbstractPersistenceManager.preCommit(AbstractPersistenceManager.java:3204)
at org.jpox.NonmanagedTransaction.commit(NonmanagedTransaction.java:438)
at com.macif.test.CreateData.main(CreateData.java:52)
Apparemment, il me dit (si je traduis correctement) qu'il aimerait avoir une colonne assures dans ma table proposition. Toutefois, assures etant l'objet d'une relation N-M, il ne doit donc pas chercher assures dans une colonne mais dans la tabler assuré... il doit donc y avoir un probleme avec mon mapping :?
Si vous voyez une anomalie dans ce mapping, vous pouvez toujours m'en faire part ... comme tout remarque ou suggestions...
Merci d'avance pour vos réponses...