2009-05-03 13 views
5

Ich habe eine Eins-zu-Eins-Beziehung zwischen einer Unternehmensklasse und einer CompanySettings-Klasse. Wenn ich ein neues Firmen Objekt zu erstellen, (a CompanySettings Objekt ist für seine Einstellungen Eigenschaft in Gesellschaft Konstruktor erstellt), und dannNHibernate, Eins-zu-eins-Zuordnung, Kaskadeneinfügung

SaveOrUpdate(session, companyObject) 

erwarte ich, dass die INSERT Kaskade von der Gesellschaft an die CompanySettings. Dies geschieht jedoch nicht, wenn ich SaveOrUpdate nicht explizit auch für das CompanySettings-Objekt aufruft.

Mapping-Dateien unten dargestellt:

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

Meine Zuordnungsdatei für die Gesellschaft Klasse Einstellungen:

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

Antwort

5

Haben Sie versucht, cascade="all" auf one-to-one Mapping spezifiziert?

2

Legen Sie das Kaskadenattribut des Eins-zu-eins-Objekts im Unternehmensmapping fest.

Aber, in einer anderen Anmerkung: Haben Sie daran gedacht, die CompanySettings als eine "Komponente" des Unternehmens statt einer separaten Entität zuzuordnen?

Ist es nicht so, dass "CompanySettings" ein "Wertobjekt" ist, und sollte besser als eine Komponente abgebildet werden?

Dadurch können Sie die CompanySettings-Werte in derselben Tabelle wie "Company" ablegen, aber sie werden als separate Klasse behandelt.

Da dies eine Eins-zu-Eins-Zuordnung ist, denke ich, dass es auch für Ihr Datenmodell eine bessere Option ist.

Dann Ihr Mapping würde wie folgt aussehen:

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

Sie werden in die Tat zwei getrennte Objekte (Firma & CompanySettings haben, und Unternehmen haben ein ‚Companysettings‘ Objekt, aber die Einstellungen werden in gespeichert werden die Unternehmenstabelle).

Oder gibt es einen besonderen Grund, warum Sie die CompanySettings in einer separaten Tabelle abgelegt haben? Ich meine, es ist eine Eins-zu-Eins-Beziehung, also ist das absolut nicht notwendig (und imho sogar eine schlechte Übung :)).