views:

150

answers:

2

How do I create an optional one-to-one mapping in the hibernate hbm file? For example, suppose that I have a User and a last_visited_page table. The user may or may not have a last_visited page. Here is my current one-to-one mapping in the hbm file:

User Class:

<one-to-one name="lastVisitedPage" class="LastVisitedPage" cascade="save-update">

LastVisitedPage Class:

<one-to-one name="user" class="user" constrained="true" />

The above example does not allow the creation of a user who does not have a last visited page. A freshly created user has not visited any pages yet. How do I change the hbm mapping to make the userPrefs mapping optional?

A: 

To my knowledge, Hibernate doesn't support optional one-to-one (see HHH-2007) so you'll have to use a fake many-to-one with not-null="false" instead.

Pascal Thivent
A: 

If a user has at most one last_visited page, then there are two cases :

(a) some given user has no last_visited page, in which case there will not be any tuple for this user in the last_visited_page table, (b) some given user has exactly one last_visited page, in which case there will be exactly one tuple for this user in the last_visited_page table.

That should make it obvious that userid is a candidate key in your last-visited-page table.

And that should make it obvious that you should declare that key to the DBMS.

Erwin Smout