![]() | ![]() |
![]() |
| Project | Ver 1.1 | Ver 1.2 | JDO | JPA | Guides | Tools |
| 1.2 | Persistence | JDO ORM | JPA ORM | Runtime | JDO Runtime | JPA Runtime | Extensions | Developer |
![]() You have a M-to-N (or Many-to-Many) relationship if an object of a class A has associated objects of class B, and class B has associated objects of class A. This relationship may be achieved through Java Collection, Set, List or subclasses of these, although the only one that supports a true M-N is Set. With JPOX this can be set up as described in this section, using what is called a Join Table relationship. Let's take the following example and describe how to model it with the different types of collection classes. We have 2 classes, Product and Supplier as below. ![]() Here the Product class knows about the Supplier class. In addition the Supplier knows about the Product class, however with these relationships are really independent.
If you define the Meta-Data for these classes as follows
<entity-mappings>
<entity class="mydomain.Product">
<table name="PRODUCT"/>
<attributes>
<id name="id">
<column name="PRODUCT_ID"/>
</id>
<basic name="name">
<column name="NAME"/>
</basic>
<basic name="price">
<column name="PRICE"/>
</basic>
<many-to-many name="suppliers" mapped-by="products">
<join-table name="PRODUCTS_SUPPLIERS">
<join-column name="PRODUCT_ID"/>
<inverse-join-column name="SUPPLIER_ID"/>
</join-table>
</many-to-many>
</attributes>
</entity>
<entity class="mydomain.Supplier">
<table name="SUPPLIER"/>
<attributes>
<id name="id">
<column name="SUPPLIER_ID"/>
</id>
<basic name="name">
<column name="NAME"/>
</basic>
<many-to-many name="products"/>
</attributes>
</entity>
</entity-mappings>Note how we have specified the information only once regarding join table name, and join column names as well as the <join-table>. This is the JPA standard way of specification, and results in a single join table. The "mapped-by" ties the two fields together. ![]() See also :-
If you define the Meta-Data for these classes as follows
<entity-mappings>
<entity class="mydomain.Product">
<table name="PRODUCT"/>
<attributes>
<id name="id">
<column name="PRODUCT_ID"/>
</id>
<basic name="name">
<column name="NAME"/>
</basic>
<basic name="price">
<column name="PRICE"/>
</basic>
<many-to-many name="suppliers" mapped-by="products">
<order-by>name</order-by>
<join-table name="PRODUCTS_SUPPLIERS">
<join-column name="PRODUCT_ID"/>
<inverse-join-column name="SUPPLIER_ID"/>
</join-table>
</many-to-many>
</attributes>
</entity>
<entity class="mydomain.Supplier">
<table name="SUPPLIER"/>
<attributes>
<id name="id">
<column name="SUPPLIER_ID"/>
</id>
<basic name="name">
<column name="NAME"/>
</basic>
<many-to-many name="products">
<order-by>name</order-by>
</many-to-many>
</attributes>
</entity>
</entity-mappings>There will be 3 tables, one for Product, one for Supplier, and the join table. The difference from the Set example is that we now have <order-by> at both sides of the relation. This has no effect in the datastore schema but when the Lists are retrieved they are ordered using the specified order-by. ![]()
Please be aware of the following.
|