2011-05-03 3 views
0

J'essaie actuellement de créer deux mappings un-à-un simples en utilisant Hibernate mais de toute façon cela ne fonctionne pas comme je le veux.Comment mapper correctement 2 associations one-to-one dans Hibernate

Ma classe primaire est appelée MailAccount et sa cartographie ressemble à ceci:

<?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> 

Le fichier de mappage du serveur ressemble à ceci:

<?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> 

Maintenant, si je laisse Hibernate créer les tables, je obtenir à peu près ce que je veux: Une table "MailAccount" avec la colonne "MAIL_ACCOUNT_ID" et une autre table "MailServer" également avec une colonne pour l'id.

Si j'appelle session.save(mailAccountInstance);, Hibernate enregistre correctement les données dans les tables.

MAIS une fois que je tente de charger les données dans une instance MailAccount, Hibernate ne charge que la propriété « IncomingServer » dans une nouvelle instance MailAccount et la propriété outgoingServer est vide.

Je ne comprends pas non plus comment Hibernate joint les deux tables puisque la table "MailServer" n'enregistre pas l'identifiant de MailAccount auquel chaque serveur appartient en tant que clé étrangère.

Comment puis-je résoudre ce problème?

Merci d'avance!

Ps: Je suis assez nouveau pour Hibernate, alors ne me bats pas grand-chose pour les erreurs évidentes :-)

Répondre

2

Je suggère de jeter un oeil à la Association Mappings chapter dans le manuel de référence Hibernate. Pour un bidirectional one-to-one mapping, il est suggéré d'utiliser un <one-to-one> à une extrémité et <many-to-one unique="true"> à l'autre extrémité.

+0

La définition de unique = "true" entraîne une exception en raison d'une entrée en double (l'ID MailAccount dans ce cas), mais votre suggestion fonctionne généralement. Remplacer le mappage un-à-un avec plusieurs-à-un dans le fichier MailServer.hbm.xml a fait l'affaire! Merci. – Timo

Questions connexes