Отношение «многие ко многим» в DataNucleus (JDO) не сохраняется - PullRequest
3 голосов
/ 10 августа 2009

Мне не удается сохранить связь «многие ко многим» с DataNucleus с помощью JDO. У меня есть два класса Book и Shop. Это файл отображения orm:

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

<orm>
    <package name="com.mypackage.pojo">
        <class name="Book" identity-type="datastore">
            <datastore-identity>
                <column name="BOOK_ID" />
            </datastore-identity>

            <field name="name">
                <column length="100" jdbc-type="VARCHAR" />
            </field>

            <field name="shops" persistence-modifier="persistent"
                    table="BOOKS_SHOPS">
                <collection element-type="com.mypackage.pojo.Shop" />
                <join>
                    <column name="BOOK_ID" />
                </join>
                <element>
                    <column name="SHOP_ID" />
                </element>
            </field>
        </class>

        <class name="Shop" identity-type="datastore">
            <datastore-identity>
                <column name="SHOP_ID" />
            </datastore-identity>

            <field name="name">
                <column length="50" jdbc-type="VARCHAR" />
            </field>

            <field name="books" persistence-modifier="persistent" 
                    table="BOOKS_SHOPS">
                <collection element-type="com.mypackage.pojo.Book" />
                <join>
                    <column name="SHOP_ID" />
                </join>
                <element>
                    <column name="BOOK_ID" />
                </element>
            </field>
        </class>
    </package>
</orm>

Я пытаюсь связать книгу с магазином и наоборот, как это:

shop.addBook(book);
book.addShop(shop);

Повторное сохранение этих двух объектов ничего не дает. Как до, так и после небольшого фрагмента кода выше, их ObjectState равно detached-clean.

Что я мог делать не так?

1 Ответ

4 голосов
/ 10 августа 2009

У меня есть рабочее решение, но я должен признать, что не до конца понимаю все. Все работает, когда последний элемент field не определен как

<field name="books" persistence-modifier="persistent" table="BOOKS_SHOPS">

а как

<field name="books" persistence-modifier="persistent" mapped-by="shops">

Это решило мою проблему.

См. Также руководство DataNucleus по Отношения JDO M-N . Однако пропустить элементы join и element, как это делается в этом примере, у меня не получилось. Другая важная ссылка на сайте DataNucleus - Руководства JDO: отношение M-N . Код для этого последнего примера можно найти на SourceForge . К сожалению, этот пример у меня тоже не сработал.

Это не очень хороший ответ, но все, что я могу предложить сейчас ...

...