Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

NHibernate: Complex relationships

DZone's Guide to

NHibernate: Complex relationships

· Database Zone ·
Free Resource

RavenDB vs MongoDB: Which is Better? This White Paper compares the two leading NoSQL Document Databases on 9 features to find out which is the best solution for your next project.  

I got an interesting question today (I am teaching my NHibernate course now).

The tabular structure is similar to this:

image

But the desired object structure is:

image

That is quite different than the tabular model, but it is actually very easy to handle this with NHibernate.

Here are the mapping for the Address entity. We use the <join/> tag to have an entity that spans more than a single table:

<class name="Address"
table="Addresses">
<id name="Id">
<generator class="identity"/>
</id>
<property name="City" />

<join table="PeopleAddresses" >
<key column="AddressId"/>
<property name="IsDefault"/>
<property name="ValidFrom"/>
<property name="ValidTo"/>
</join>

</class>

We then map the Person, using standard many-to-many mapping for the addresses:

 <class name="Person"
table="People">

<id name="Id">
<generator class="identity"/>
</id>
<property name="Name" />

<bag name="Addresses" table="PeopleAddresses" inverse="true">
<key column="PersonId"/>
<many-to-many class="Address" column="AddressId"/>
</bag>

</class>

There is just one thing thing to be aware of, you can’t add new addresses via the Person.Addresses collection, because the PeopleAddresses table has more data in it than just the keys. Presumably, you are handling this in some other fashion already.

All in all, this is a pretty elegant solution.

Get comfortable using NoSQL in a free, self-directed learning course provided by RavenDB. Learn to create fully-functional real-world programs on NoSQL Databases. Register today.

Topics:

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}