2009-05-03 5 views
5

J'ai une relation un-à-un entre une classe Company et une classe CompanySettings. Lorsque je crée un nouvel objet de l'entreprise, (un objet CompanySettings est créé dans le constructeur de la société pour sa propriété Paramètres), puisNHibernate, mappage un-à-un, insertion en cascade

SaveOrUpdate(session, companyObject) 

Je pense que le INSERT à la cascade de la Société aux CompanySettings. Toutefois, cela ne se produit pas sauf si j'appelle explicitement SaveOrUpdate sur l'objet CompanySettings.

fichiers de mappage affichés ci-dessous:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"`> 
    <class name="AST.Domain.Company, AST.Domain" table="Companies"> 
    <id name="EntityID" column="CompanyId"> 
     <generator class="guid.comb" /> 
    </id> 
    <property name="CompanyName" /> 
    . . . 
    <one-to-one name="Settings" class="AST.Domain.CompanySettings, AST.Domain" 
       constrained="true" lazy="false" /> 
    </class> 
</hibernate-mapping> 

Mon fichier de mappage de la classe des paramètres de société:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="AST.Domain.CompanySettings, AST.Domain" table="CompanySettings"> 
    <id name="EntityID" column="CompanyId"> 
     <generator class="foreign"> 
     <param name="property">Company</param> 
     </generator> 
    </id> 
    <property name="MaxUsers" /> 
    <one-to-one name="Company" class="AST.Domain.Company, AST.Domain" /> 
    </class> 
</hibernate-mapping> 

Répondre

5

Avez-vous essayé spécifier cascade="all" sur votre cartographie one-to-one?

2

Définissez l'attribut de cascade de l'un-à-un dans le mappage d'entreprise. Mais, sur une autre note: Avez-vous pensé à mapper les CompanySettings en tant que «composant» de la Société au lieu d'une entité distincte?

N'est-il pas vrai que 'CompanySettings' est un 'objet de valeur', et devrait être mieux mappé en tant que composant? En faisant cela, vous pouvez mettre les valeurs de CompanySettings dans la même table que 'Company', mais elles seront traitées comme une classe distincte.

Comme il s'agit d'un mappage un-à-un, je pense que c'est également une meilleure option pour votre modèle de données.

Ensuite, votre cartographie ressemblerait à quelque chose comme ceci:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"`> 
    <class name="AST.Domain.Company, AST.Domain" table="Companies"> 
    <id name="EntityID" column="CompanyId"> 
     <generator class="guid.comb" /> 
    </id> 
    <property name="CompanyName" /> 
    . . . 
    <component name="Settings" class="AST.Domain.CompanySettings, AST.Domain"> 
     <property name="MaxUsers" /> 
    </component> 
    </class> 
</hibernate-mapping> 

Vous aurez en effet deux objets distincts (Société & CompanySettings et Société aura un objet « Companysettings », mais les paramètres seront enregistrés dans le tableau de la compagnie).

Ou, y a-t-il une raison particulière pour laquelle vous avez placé les CompanySettings dans un tableau séparé? Je veux dire, c'est une relation de one-to-one donc ce n'est pas du tout nécessaire (et même une mauvaise pratique :)).

Questions connexes