J'ai trouvé les liens suivants:Hibernate one-to-one mapping XML
- Hibernate one to one mapping problem
- Hibernate one-to-one mapping with a reference column (XML mapping)
- hibernate one-to-one (on foreign key) vs one-to-one (on primary key)
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 null
User
.
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;
}
}
pouvez-vous partager votre code DAO? –
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'. –