Генерация схемы Datanucleus игнорирует директиву стратегии наследования =

Я работаю с учебным приложением Datanucleus для JDO, конкретно этот.

Независимо от того, какую «стратегию наследования» я использую, макет таблицы одинаков. Мне нужны две таблицы, одна для PRODUCT и одна для BOOK, но, используя приведенную ниже конфигурацию, я получаю только таблицу PRODUCT со столбцами как для класса Product, так и для класса Book.

   <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> 

Структура каталогов точно такая же, как и в руководстве, как и в файле build.xml. Я попытался создать схему как с помощью задачи Ant, так и с помощью командной строки.

Я использую последовательность команд:

    ant clean
    ant compile
    ant enhance
    ant createschema

Схема генерируется, но не так, как в документации Datanucleus предполагается, что она должна быть со стратегией наследования "compete-table".

Моя целевая база данных — PostgreSQL 8.4, работающая на Ubuntu 10.04, если это имеет значение.

Кто-нибудь еще сталкивался с этой проблемой и нашел решение?


person Marek    schedule 25.11.2010    source источник


Ответы (2)


Чтобы ответить на мой собственный вопрос:

В загруженном учебном пособии datanucleus указанный файл build.xml имеет цель «createschema», например:

<target name="createschema">
    ...

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

Его следует изменить, чтобы включить все файлы .jdo, как показано ниже:

<target name="createschema">
    ...

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

Кроме того, файл package-hsql.orm необходимо переименовать в package-hsql.jdo, а его заголовок необходимо изменить на:

<?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>

Обратите внимание, что DOCTYPE и корневой элемент были изменены. Корневой элемент был "orm" и изменен на "jdo".

Как только я внес эти изменения, инструмент генерации схемы следовал директиве «стратегия наследования».

person Marek    schedule 25.11.2010
comment
Ничего не нужно менять. Я запускаю текущую версию (2.2) с помощью Ant, и все работает. Ваша ситуация симптоматична для кого-то, кто не использовал предоставленный файл build.xml и, следовательно, не имеет файлов ORM в вашем CLASSPATH - person DataNucleus; 27.11.2010
comment
Хорошо, я попробую версию 2.2. Вышеуказанные проблемы возникли из-за попытки использовать версию 2.1. - person Marek; 03.12.2010

Для моего пользовательского приложения у меня была аналогичная проблема, и она отлично работала после внесения изменений в заголовок файла jdo. Я использую версию 3.2.9.

person Avita    schedule 06.01.2014