2010-11-25 51 views
0

Je travaille avec l'application de tutoriel Datanucleus pour JDO, specifically this one. Quelle que soit la «stratégie d'héritage» que j'essaie, la disposition de la table est la même. Je voudrais deux tables, une pour PRODUCT et une pour BOOK, mais en utilisant la configuration ci-dessous, je reçois seulement la table PRODUCT avec des colonnes à la fois pour le produit de classe et le livre de classe.La génération de schéma Datanucleus ignore la directive "inheritance strategy ="

<class name="Product" identity-type="sequence"> 
     <inheritance strategy="complete-table"/> 
     <field name="name"> 
      <column name="PRODUCT_NAME" length="100" jdbc-type="VARCHAR"/> 
     </field> 
     <field name="description"> 
      <column length="255" jdbc-type="VARCHAR"/> 
     </field> 
    </class> 

    <class name="Book" identity-type="sequence"> 
     <field name="author"> 
      <column length="40" jdbc-type="VARCHAR"/> 
     </field> 
     <field name="isbn"> 
      <column length="20" jdbc-type="CHAR"/> 
     </field> 
     <field name="publisher"> 
      <column length="40" jdbc-type="VARCHAR"/> 
     </field> 
    </class> 

La structure du répertoire est exactement comme dans le didacticiel, tout comme le fichier build.xml. J'ai essayé de générer le schéma via la tâche Ant et la ligne de commande.

J'utilise la séquence de commandes:

ant clean 
    ant compile 
    ant enhance 
    ant createschema 

Le schéma est généré, mais pas la documentation DataNucleus suggère qu'il devrait être avec la stratégie d'héritage « concurrence table. »

Ma base de données cible est PostgreSQL 8.4 exécutée sur Ubuntu 10.04 si cela est important.

Quelqu'un d'autre a rencontré ce problème et trouvé une solution?

Répondre

0

Pour répondre à ma propre question:

Dans le téléchargement tutoriel DataNucleus, le fichier build.xml donné a une cible "createschema" comme:

<target name="createschema"> 
    ... 

    <schematool ...> 
     <fileset dir="${basedir}/target/classes"> 
      <include name="**/*.class"/> 
     </fileset> 
     ... 
    </schematool> 
</target> 

Il devrait être modifié pour inclure tous .jdo fichiers comme ci-dessous:

<target name="createschema"> 
    ... 

    <schematool ...> 
     <fileset dir="${basedir}/target/classes"> 
      <include name="**/*.class"/> 
      <include name="**/*.jdo"/> 
     </fileset> 
     ... 
    </schematool> 
</target> 

En outre, le fichier de package-hsql.orm doit être renommé pour emballer-hsql.jdo et son en-tête doit être modifiée:

<?xml version="1.0"?> 
<!DOCTYPE jdo PUBLIC 
    "-//Sun Microsystems, Inc.//DTD Java Data Objects ORM Metadata 2.0//EN" 
    "http://java.sun.com/dtd/orm_2_0.dtd"> 
<jdo> 
    ... 
<jdo> 

Notez que le DOCTYPE et l'élément racine ont été modifiés. L'élément racine était "orm" et changé en "jdo". Une fois ces modifications effectuées, l'outil de génération de schéma suivait la directive "stratégie d'héritage".

+0

Rien ne doit être changé. Je cours la version actuelle (2.2) en utilisant Ant et tout fonctionne. Votre situation est symptomatique de quelqu'un qui n'a pas utilisé le build.xml fourni et, par conséquent, n'a pas les fichiers ORM dans votre CLASSPATH – DataNucleus

+0

D'accord, je vais essayer la version 2.2. Les problèmes ci-dessus provenaient d'essayer la version 2.1. – Marek

0

Pour mon application personnalisée, j'ai rencontré un problème similaire, et cela a bien fonctionné après avoir apporté les modifications dans l'en-tête du fichier jdo. J'utilise la version 3.2.9.