|
You have a 1-to-1 relationship when an object of a class has an associated object of another class (only
one associated object). It could also be between an object of a class and another object of the same class
(obviously). You can create the relationship in 2 ways depending on whether the 2 classes know about each
other (bidirectional), or whether only one of the classes knows about the other class (unidirectional).
These are described below.
The various possible relationships are described below.
For this case you could have 2 classes,
User
and
Account
, as below.
so the
Account
class knows about the
User
class, but not vice-versa. If you define the
Meta-Data for these classes as follows
<package name="mydomain">
<class name="User" table="USER">
<field name="id" primary-key="true">
<column name="USER_ID"/>
</field>
<field name="login">
<column name="LOGIN" length="20" jdbc-type="VARCHAR"/>
</field>
</class>
<class name="Account" table="ACCOUNT">
<field name="id" primary-key="true">
<column name="ACCOUNT_ID"/>
</field>
<field name="firstName">
<column name="FIRSTNAME" length="50" jdbc-type="VARCHAR"/>
</field>
<field name="secondName">
<column name="SECONDNAME" length="50" jdbc-type="VARCHAR"/>
</field>
<field name="user" persistence-modifier="persistent">
<column name="USER_ID"/>
</field>
</class>
</package>
This will create 2 tables in the database, one for
User
(with name
USER
), and one for
Account
(with name
ACCOUNT
and a column
USER_ID
), as shown below.
Things to note :-
-
Account
has the object reference (and so owns the relation) to
User
and so its table
holds the foreign-key
-
If you call
PM.deletePersistent()
on the end of a 1-1 unidirectional relation without the
relation and that object is related to another object, an exception will typically be thrown
(assuming the RDBMS supports foreign keys). To delete this record you should remove the other
objects association first.
For this case you could have 2 classes,
User
and
Account
again, but this time as below.
Here the
Account
class knows about the
User
class, and also vice-versa.
Here we create the 1-1 relationship with a single foreign-key. To do this you define the MetaData as
<package name="mydomain">
<class name="User" table="USER">
<field name="id" primary-key="true">
<column name="USER_ID"/>
</field>
<field name="login">
<column name="LOGIN" length="20" jdbc-type="VARCHAR"/>
</field>
<field name="account" persistence-modifier="persistent" mapped-by="user">
</field>
</class>
<class name="Account" table="ACCOUNT">
<field name="id" primary-key="true">
<column name="ACCOUNT_ID"/>
</field>
<field name="firstName">
<column name="FIRSTNAME" length="50" jdbc-type="VARCHAR"/>
</field>
<field name="secondName">
<column name="SECONDNAME" length="50" jdbc-type="VARCHAR"/>
</field>
<field name="user" persistence-modifier="persistent">
<column name="USER_ID"/>
</field>
</class>
</package>
The difference is that we added
mapped-by
to the field of
User
. This will create 2 tables
in the database, one for
User
(with name
USER
), and one for
Account
(with name
ACCOUNT
including a
USER_ID
). The fact that we specified the
mapped-by
on the
User
class means that the foreign-key is created in the ACCOUNT table.
Things to note :-
-
The "mapped-by" is specified on
User
(the non-owning side) and so the foreign-key is held
by the table of
Account
(the owner of the relation)
-
When forming the relation please make sure that
you set the relation at BOTH sides
since
DataNucleus would have no way of knowing which end is correct if you only set one end.
The above 2 relationship types assume that both classes in the 1-1 relation will have their own table.
You can, of course, embed the elements of one class into the table of the other. This is
described in Embedded PC Objects.
|
|