2009-04-28 3 views
1

у меня есть реляционная БД, содержит таблицы и все виды отношений (1> п, п> 1, 1> 1 и п> п) ..Hibernate с отношениями

Давайте возьмем один из этих таблиц, является Таблица «Департамент», эта таблица является самой сложной таблицей в моей БД, поскольку она имеет отношения с большей частью таблицы в БД.

XML-файл отображения «Department.hbm.xml» выглядит следующим образом:

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

Несколько раз мне нужно принести в отдел без каких-либо отношений. В другое время мне нужно получить отделы с некоторыми из его отношений ...

Каков наилучший способ сделать это .. принять во внимание производительность и количество ударов БД.

ответ

1

Включение ленивой загрузки путем установки lazy = "true" - лучший способ. Есть ли причина, по которой вы установили ее в false во время вашего сопоставления?

Другой подход - не моделировать все отношения в вашей объектной модели.

+0

Спасибо за вашу помощь ... Но если я установил lazy = "true" для любых отношений, он будет недоступен, когда мне это понадобится, например: давайте возьмем связь между Департаментом и ApplicationUser, который является много- один и его имя = "applicationUserByManagerId", если я установил его в lazy = "true", поэтому, когда в моем коде я вызываю: department.getApplicationUserByManagerId(); он будет вызывать ошибку. Чтобы избежать этой ошибки, я устанавливаю lazy = "false" и начинаю сталкиваться с первой проблемой, которая: «принести все отношения, хотя мне это не нужно», поэтому что делать в этом случае. ПОЖАЛУЙСТА, помогите мне ... Благодарим вас в ADVANCE ... Saeed – Saeed

+0

Lazy loading не работает для вас, потому что ISession, используемый для извлечения отдела, закрывается, когда вы пытаетесь получить доступ к дочерним коллекциям. Можно повторно связать отдельный объект с новым ISession, используя ISession.Lock. См. Http://intellect.dk/post/Detached-objects-in-nHibernate-and-Lazy-loading.aspx. Я предлагаю удалить все коллекции, кроме одного из отдела, и работать с этим простым случаем, пока вы узнаете, как лучше всего выполнять ленивую загрузку в своем приложении. –