Связь «многие ко многим» в DataNucleus (JDO) не сохраняется

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

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

Что я могу делать неправильно?


person Benno Richters    schedule 10.08.2009    source источник


Ответы (1)


У меня есть рабочее решение, но должен признать, что я не совсем все понимаю. Все работает, когда последний элемент 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: MN Relation< /а>. Код последнего примера можно найти на SourceForge. К сожалению, этот пример также не работал для меня.

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

person Benno Richters    schedule 10.08.2009
comment
Так как mapped-by необходим для взаимосвязи двух сторон отношения... то есть двунаправленного. - person DataNucleus; 12.08.2009