2009-05-03 7 views
5

Tengo una relación uno a uno entre una clase de empresa y una clase CompanySettings. Cuando se crea un nuevo objeto de empresa, (un objeto CompanySettings se crea en el constructor de la empresa de su propiedad Configuración), y despuésNHibernate, asignación de uno a uno, inserción en cascada

SaveOrUpdate(session, companyObject) 

espero que la INSERT para cascada de la Sociedad a los CompanySettings. Sin embargo, esto no ocurre a menos que también llame explícitamente SaveOrUpdate al objeto CompanySettings.

archivos de asignación se muestra a continuación:

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

Mi archivo de asignación para la clase Configuración de la empresa:

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

Respuesta

5

Ha intentado especificar cascade="all" en su one-to-one mapeo?

2

Establezca el atributo de cascada del uno a uno en la asignación de la empresa.

Pero, en otra nota: ¿Ha pensado en mapear CompanySettings como un 'componente' de la empresa en lugar de una entidad separada?

¿No es así que 'CompanySettings' es un 'objeto de valor' y debería correlacionarse mejor como un componente?

Al hacer esto, puede poner los valores de CompanySettings en la misma tabla que 'Empresa', pero se tratará como una clase separada.

Dado que este es un mapeo de uno a uno, creo que es una mejor opción para su modelo de datos también.

Entonces, el mapeo sería algo como esto:

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

Usted tendrá de hecho 2 objetos separados (Compañía & CompanySettings, y de la compañía tendrá un objeto 'Companysettings', pero los ajustes se guardarán en la tabla de la compañía).

O, ¿hay alguna razón especial sobre por qué ha puesto CompanySettings en una tabla separada? Quiero decir, es una relación de uno a uno, así que esto no es completamente necesario (e incluso una mala práctica :)).

Cuestiones relacionadas