tags:

views:

196

answers:

3

I've seen people use many-to-one mappings to represent one-to-one relationships. I've also read this in a book by Gavin King and on articles.

For example, if a customer can have exactly one shipping address, and a shipping address can belong to only one customer, the mapping is given as:

<class name="Customer" table="CUSTOMERS">
    ...
    <many-to-one name="shippingAddress"
                 class="Address"
                 column="SHIPPING_ADDRESS_ID"
                 cascade="save-update"
                 unique="true"/>
    ...
</class>

The book reasons as (quoting it):

"You don't care what's on the target side of the association, so you can treat it like a to-one association without the many part."

My question is, why use many-to-one and not one-to-one? What is it about a one-to-one that makes it a less desirable option to many-to-one?

Thanks.

A: 

It's even in official Hibernate docs: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/associations.html#assoc-bidirectional-121.

It's not totally unreasonable. The many-to-one end says: I am mapped via one of my columns to an ID of the -one end. You would use the exact same database schema for many-to-one.

Konrad Garus
+1  A: 

I would say the problem is fundamentally related to the object-relational impedance mismatch. To be able to relate the two object representations in a database, you need to have some sort of relationship between their tables. However, the database knows only the 1:N relationship: all the others are derived from it.

With relational databases and object languages, it's up to the developer to find the least unnatural representation of the concept he/she wants to represent (in this case, a 1:1 relationship).

Tomislav Nakic-Alfirevic
+2  A: 

There are several ways to implement a one-to-one association in a database: you can share a primary key but you can also use a foreign key relationship with a unique constraint (one table has a foreign key column that references the primary key of the associated table).

In the later case, the hibernate way to map this is to use a many-to-one association (that allows to specify the foreign key).

The reason is simple: You don’t care what’s on the target side of the association, so you can treat it like a to-one association without the many part. All you want is to express “This entity has a property that is a reference to an instance of another entity” and use a foreign key field to represent that relationship.

In other words, using a many-to-one is the way to map one-to-one foreign key associations (which are actually maybe more frequent than shared primary key one-to-one associations).

Pascal Thivent