2009-04-28 17 views
1

ich eine relationale DB haben, enthält Tabellen und alle Arten von Beziehungen (1> n, n> 1, 1> 1 und n> n) ..mit Beziehungen

ist eine dieser Tabellen nehmen lassen, die ist "Tabelle" Tabelle, diese Tabelle ist die komplizierteste Tabelle in meiner DB, da sie Beziehungen mit den meisten der Tabelle in der DB hat.

Die XML-Mapping-Datei "Department.hbm.xml" wie folgt aussieht:

<hibernate-mapping> 
<class catalog="MOIDB" 
    name="com.ebla.moi.correspondence.model.entity.db.Department" 
    schema="dbo" table="Department"> 
    <id name="id" type="java.lang.Integer"> 
    <column name="Id"/> 
    <generator class="increment"/> 
    </id> 
    <many-to-one 
    class="com.ebla.moi.correspondence.model.entity.db.Department" 
    fetch="select" name="department"> 
    <column name="Parent"/> 
    </many-to-one> 
    <many-to-one 
    class="com.ebla.moi.correspondence.model.entity.db.ApplicationUser" 
    fetch="join" lazy="false" name="applicationUserByManagerId"> 
    <column name="Manager_Id"/> 
    </many-to-one> 
    <many-to-one 
    class="com.ebla.moi.correspondence.model.entity.db.ApplicationUser" 
    fetch="join" lazy="false" name="applicationUserByAssistantId"> 
    <column name="Assistant_Id"/> 
    </many-to-one> 
    <property generated="never" lazy="false" name="description" type="java.lang.String"> 
    <column length="80" name="Description" not-null="true"/> 
    </property> 
    <property generated="never" lazy="false" name="type" type="java.lang.Integer"> 
    <column name="Type" not-null="true"/> 
    </property> 
    <property generated="never" lazy="false" name="prefix" type="java.lang.String"> 
    <column length="20" name="Prefix" unique="true"/> 
    </property> 
    <property generated="never" lazy="false" name="serialPrefix" type="java.lang.String"> 
    <column length="20" name="Serial_Prefix"/> 
    </property> 
    <property generated="never" lazy="false" name="telephoneNumbers" type="java.lang.String"> 
    <column length="100" name="Telephone_Numbers"/> 
    </property> 
    <property generated="never" lazy="false" name="faxNumbers" type="java.lang.String"> 
    <column length="100" name="Fax_Numbers"/> 
    </property> 
    <property generated="never" lazy="false" name="smsMaxTime" type="java.lang.Integer"> 
    <column default="30" name="SMS_Max_Time"/> 
    </property> 
    <property generated="never" lazy="false" name="emailMaxTime" type="java.lang.Integer"> 
    <column default="30" name="Email_Max_Time"/> 
    </property> 
    <property generated="never" lazy="false" name="hasCorrespondence" type="java.lang.Boolean"> 
    <column name="Has_Correspondence" not-null="true"/> 
    </property> 
    <property generated="never" lazy="false" name="email" type="java.lang.String"> 
    <column length="50" name="Email"/> 
    </property> 
    <property generated="never" lazy="false" name="logoImageName" type="java.lang.String"> 
    <column length="50" name="Logo_Image_Name"/> 
    </property> 
    <set inverse="true" name="departmentDocumentTypeSerials" sort="unsorted"> 
    <key> 
    <column name="Department_Id" not-null="true"/> 
    </key> 
    <one-to-many class="com.ebla.moi.correspondence.model.entity.db.DepartmentDocumentTypeSerial"/> 
    </set> 
    <set inverse="true" name="departmentGlobalVariableses" sort="unsorted"> 
    <key> 
    <column name="Department_Id" not-null="true"/> 
    </key> 
    <one-to-many class="com.ebla.moi.correspondence.model.entity.db.DepartmentGlobalVariables"/> 
    </set> 
    <set inverse="true" name="departmentFiles" sort="unsorted"> 
    <key> 
    <column name="Department_Id" not-null="true"/> 
    </key> 
    <one-to-many class="com.ebla.moi.correspondence.model.entity.db.DepartmentFile"/> 
    </set> 
    <set catalog="MOIDB" name="applicationUsers" schema="dbo" 
    sort="unsorted" table="Application_User_Department"> 
    <key> 
    <column name="Department_Id" not-null="true"/> 
    </key> 
    <many-to-many class="" 
    entity-name="com.ebla.moi.correspondence.model.entity.db.ApplicationUser" unique="false"> 
    <column name="Application_User_Id" not-null="true"/> 
    </many-to-many> 
    </set> 
    <set inverse="true" name="departments" sort="unsorted"> 
    <key> 
    <column name="Parent"/> 
    </key> 
    <one-to-many class="com.ebla.moi.correspondence.model.entity.db.Department"/> 
    </set> 
    <set inverse="true" lazy="false" name="departmentClassifications" sort="unsorted"> 
    <key> 
    <column name="Department_Id" not-null="true"/> 
    </key> 
    <one-to-many class="com.ebla.moi.correspondence.model.entity.db.DepartmentClassification"/> 
    </set> 
    <set inverse="true" lazy="false" name="depCorrespondenceSites" sort="unsorted"> 
    <key> 
    <column name="Department_Id" not-null="true"/> 
    </key> 
    <one-to-many class="com.ebla.moi.correspondence.model.entity.db.DepCorrespondenceSite"/> 
    </set> 
</class> 
</hibernate-mapping> 

Einige Male habe ich die Abteilung ohne Beziehungen holen müssen. Andere Zeit, ich muss Abteilungen mit einigen seiner Beziehungen abholen ...

Was ist der beste Weg, das zu tun .. berücksichtigen Sie die Leistung und die Anzahl der DB-Treffer.

Antwort

1

Die Aktivierung von Lazy Loading durch Setzen von lazy = "true" ist der beste Weg. Gibt es einen Grund, warum Sie es während Ihres Mappings auf false gesetzt haben?

Ein anderer Ansatz besteht darin, nicht alle Beziehungen in Ihrem Objektmodell zu modellieren.

+0

Vielen Dank für Ihre Hilfe ... Aber wenn ich faul = "wahr" für irgendwelche Beziehungen, wird es nicht verfügbar, wenn ich es brauche, zum Beispiel: Lassen Sie uns die Beziehung zwischen Abteilung und ApplicationUser nehmen, die viele zu eins und sein Name = "applicationUserByManagerId", wenn ich es auf lazy = "true" setze, also wenn ich -in meinem Code- rufe: department.getApplicationUserByManagerId(); es wird einen Fehler werfen .. um diesen Fehler zu vermeiden, setze ich faul = "falsch", und fange an, das erste Problem zu konfrontieren, das ist: "bring die ganze Beziehung, obwohl ich sie nicht brauche", also was in diesem Fall zu tun ist. Bitte berate mich ... Ich danke Ihnen im Voraus ... Saeed – Saeed

+0

Faulen Laden funktioniert nicht für Sie, weil die ISession zum Abrufen der Abteilung geschlossen ist, wenn Sie versuchen, auf die untergeordneten Sammlungen zuzugreifen. Es ist möglich, ein losgelöstes Objekt mit einer neuen ISession mithilfe von ISession.Lock neu zuzuordnen. Siehe http://intellect.dk/post/Detached-objects-in-nHibernate-and-Lazy-loading.aspx. Ich empfehle, alle Sammlungen außer einer aus der Abteilung zu entfernen und mit diesem einfachen Fall zu arbeiten, während Sie lernen, wie Sie in Ihrer App das Lazy-Loading am besten implementieren. –

Verwandte Themen