2009-01-21 4 views
0

Jusqu'à présent, l'association fonctionne très bien (la classe User charge la UserRoles instance appropriée lorsqu'il est présent), mais lors de la création d'une nouvelle User et sa propriété Roles à une nouvelle instance de UserRoles, l'objet UserRoles est pas enregistré.Comment mapper une association un-à-un avec NHibernate en utilisant un générateur de clé étrangère?

Voici mon User.hbm.xml abrégée:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="DistrictObservations.User, DistrictObservations" table="users"> 
    <cache usage="read-write" region="all" /> 

    <id name="ID" column="id" type="int" unsaved-value="0"> 
     <generator class="identity" /> 
    </id> 

    <!-- snip --> 

    <one-to-one name="Roles" class="DistrictObservations.UserRoles, DistrictObservations" lazy="false" /> 

    </class> 
</hibernate-mapping> 

Et voici la mise en correspondance des UserRoles:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="DistrictObservations.UserRoles, DistrictObservations" table="user_roles"> 
    <cache usage="read-write" region="all" /> 

    <id name="UserID" column="user_id" type="int" > 
     <generator class="foreign"> 
     <param name="property">User</param> 
     </generator> 
    </id> 

    <!-- snip --> 

    <one-to-one name="User" class="DistrictObservations.User, DistrictObservations" lazy="false" constrained="true" foreign-key="FK_user_roles_users" /> 

    </class> 
</hibernate-mapping> 

Quelqu'un at-il une idée comment avoir le UserRoles objet enregistré avec l'utilisateur. ID comme clé primaire? J'ai regardé la documentation, et pour être honnête, ce n'est pas particulièrement utile.

Répondre

0

Il me manque probablement quelque chose, mais avez-vous besoin d'un one-to-one entre utilisateur et UserRoles? Ne pouvez-vous pas simplement avoir un un-à-plusieurs entre l'utilisateur et le rôle? UserRoles semble redondant.

0

J'ai trouvé que le mappage un-à-un est rarement nécessaire. Ce que je considérerais souvent comme un one-to-one est généralement un mappage un-à-plusieurs. La même valeur que la clé primaire sur deux tables n'est pas quelque chose est une occurrence commune.

A en juger par l'apparence des noms de classe, il semble que vous essayez d'associer des rôles à un utilisateur? Cela ne me semble pas un one-to-one. Cela dit, il semble que le générateur de classe étrangère devrait faire ce dont vous avez besoin.

+0

je peux changer le schéma ... J'utilise le générateur étranger, mais ce n'est pas t travail lorsque je fais un sess.Save (utilisateur) – wprl

2

Habituellement, vous n'avez pas besoin d'un bi-un, sauf si vous êtes bloqué avec un schéma de base de données hérité immuable. La plupart des mappages utilisateur-rôle permettent aux utilisateurs d'être autorisés à utiliser plusieurs rôles et rôles par un nombre quelconque d'utilisateurs, ce qui signifie une table associative pour une association plusieurs-à-plusieurs.

Si votre application n'a besoin que d'un rôle par utilisateur, je suggère de placer directement le RoleId en tant que FK dans la table Users. Cela étant dit, si vous vous en tenez à un one-to-one pour une raison quelconque, assurez-vous d'utiliser inverse = "true" sur celui qui ne fera pas la mise à jour (l'entité 'enfant'). (Voir les docs Hibernate one-to-one pour plus d'informations sur l'attribut inverse - ça devrait suffire à expliquer ça.)

+0

inverse n'est pas un attribut de one-to-one. peut-être que je vais changer le schéma si. UserRoles est une rangée de valeurs booléennes en ce moment ... – wprl

Questions connexes