我无法使用JDO与DataNucleus保持多对多链接。我有两个课程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
。
我可能做错了什么?
答案 0 :(得分:4)
我有一个有效的解决方案,但不得不承认我并不完全理解一切。当最后一个field
元素未定义为
<field name="books" persistence-modifier="persistent" table="BOOKS_SHOPS">
但是作为
<field name="books" persistence-modifier="persistent" mapped-by="shops">
这解决了我的问题。
另请参阅JDO M-N Relationships上的DataNucleus手册。但是,将join
和element
元素排除在外,就像在此示例中所做的那样,对我来说不起作用。 DataNucleus网站上的另一个相关链接是JDO Guides : M-N Relation。最后一个示例的代码可以在SourceForge上找到。不幸的是,这个例子对我来说也不起作用。
这不是一个很好的答案,但我现在要提供的所有内容......