2013-08-24 4 views
1

J'ai trouvé les liens suivants:Hibernate one-to-one mapping XML

Mais rien ne semble fonctionner.

J'ai 2 entités:

class User { 
    Integer userId; 
    Profile userProfile; 
} 

class Profile { 
    Integer profileId; 
    User user; 
} 

Avec mapping XML:

<?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"> 
<hibernate-mapping> 
    <class name="model.User" table="User" catalog="Proj1" dynamic-update="true"> 
     <id name="userId" type="java.lang.Integer"> 
      <column name="userId" /> 
      <generator class="identity" /> 
     </id> 
     <one-to-one name="userProfile" class="model.Profile"> 
     </one-to-one> 
    </class> 
</hibernate-mapping> 

<?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 Jun 12, 2013 7:51:22 PM by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="model.Profile" table="Profile" catalog="Proj1" dynamic-update="true"> 
     <id name="profileId" type="java.lang.Integer"> 
      <column name="profileId" /> 
      <generator class="identity" /> 
     </id> 
     <many-to-one name="user" class="model.Users" unique="true"> 
      <column name="userId" /> 
     </many-to-one> 
    </class> 
</hibernate-mapping> 

La chose est ici, le User doit avoir exactement un Profile mais le Profile ne d'avoir pas nécessairement un User donc un Profile peut avoir nullUser.

Maintenant, le problème est à chaque fois que je vais chercher un User avec son Profile associé, le Profile récupéré est le Profile avec le profileId même que userId, qui est si le User a userId 4 le Profile récupéré est le profil avec profileId 4 et même si elle est supposée récupérer Profile avec userId 4 non profileId 4.

Mise à jour: ajouter du code Dao

public User findById(int id) { 
    log.debug("getting User instance with id: " + id); 
    try { 
     Criteria userCriteria = this.sessionFactory.getCurrentSession().createCriteria(User.class); 
     userCriteria.add(Restrictions.idEq(id)); 

     userCriteria.setFetchMode("userProfile", FetchMode.JOIN); 

     userCriteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 
     Users instance = (Users) userCriteria.uniqueResult(); 

     if(instance == null) 
      log.debug("get successful, no instance found"); 
     else 
      log.debug("get successful, instance found"); 
     return instance; 
    } 
    catch(RuntimeException re) { 
     log.error("get failed", re); 
     throw re; 
    } 
} 
+0

pouvez-vous partager votre code DAO? –

+0

J'ai toujours tendance à mapper les propriétés «one-to-one» comme «many-to-one» avec une contrainte ** unique ** dans la clé étrangère DB. Je ne sais pas si c'est censé résoudre votre problème, mais vous pouvez essayer de mapper le 'userProfile' dans votre' User' de la même manière que vous avez 'user' dans votre entité' Profile'. –

Répondre

0

Finalement, j'ai trouvé la solution. A l'origine, je devais régler le userProfile manuellement chaque fois que je devais aller chercher le userProfile associé d'un User juste pour une solution de contournement temporaire. Mais je viens de trouver ce lien: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/associations.html#assoc-bidirectional-121

Donc, fondamentalement, je viens d'ajouter unique="true" not-null="false" au many-to-one du user dans Profile xml et ajouter property-ref="user" au one-to-oneuserProfile dans User. Je pense que la clé ici est le property-ref="user"