I am currently trying to create two simple one-to-one mappings using Hibernate but somehow it doesn’t work as I want it to.
My primary class is called MailAccount and its mapping looks like this:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 26.04.2011 14:49:15 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping package="test.account">
<class name="MailAccount" table="MAILACCOUNTS" dynamic-update="true">
<id name="id" column="MAIL_ACCOUNT_ID">
<generator class="native" />
</id>
<one-to-one name="incomingServer" cascade="all" />
<one-to-one name="outgoingServer" cascade="all" />
</class>
</hibernate-mapping>
The server mapping file looks like this:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 02.05.2011 12:32:52 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
<class name="test.server.MailServer" table="MAILSERVER">
<id name="id" type="long" access="field">
<column name="MAIL_SERVER_ID" />
<generator class="native" />
</id>
<one-to-one name="mailAccount" class="test.account.MailAccount" foreign-key="MAIL_SERVER_ID"></one-to-one>
</class>
</hibernate-mapping>
Now, if I let Hibernate create the tables, I get pretty much that what I want: A table “MailAccount” with the column “MAIL_ACCOUNT_ID” and another table “MailServer” also with a column for the id.
If I call session.save(mailAccountInstance);, Hibernate correctly saves the data to the tables.
BUT once I try to load the data into a MailAccount instance, Hibernate only loads the “incomingServer” property into a new MailAccount instance and the outgoingServer property is empty.
I also don’t understand how Hibernate joins both tables together since the table “MailServer” doesn’t save the id of the MailAccount each server belongs to as a foreign key.
How can I fix this?
Thanks in advance!
Ps: I am pretty new to Hibernate, so don’t beat me up to much for obvious mistakes 🙂
I suggest taking a look at the Association Mappings chapter in the Hibernate reference manual. For a bidirectional one-to-one mapping, it’s suggested to use a
<one-to-one>on one end and<many-to-one unique="true">on the other end.