Режим извлечения изменений в спящем режиме - PullRequest
5 голосов
/ 02 февраля 2009

У меня есть две таблицы, связанные вместе, используя отношение один ко многим: сотрудник -> отдел: и связь через отдел_ид в таблице сотрудников.

Я использую hibernate: и мои файлы отображения hibernate:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping default-lazy="false">
 <class catalog="moi"
  name="com.ebla.moi.correspondence.model.entity.user.User" table="user">
  <id name="id" type="java.lang.Long">
   <column name="id"/>
   <generator class="identity"/>
  </id>
  <many-to-one
   class="com.ebla.moi.correspondence.model.entity.department.Department"
   fetch="select" name="department">
   <column name="department_id"/>
  </many-to-one>
  <property generated="never" lazy="false" name="name" type="java.lang.String">
   <column length="128" name="name" not-null="true"/>
  </property>
  <property generated="never" lazy="false" name="email" type="java.lang.String">
   <column length="128" name="email" not-null="true" unique="true"/>
  </property>
  <property generated="never" lazy="false" name="maritalStatus" type="java.lang.Short">
   <column name="marital_status" not-null="true"/>
  </property>
  <property generated="never" lazy="false" name="hireDate" type="java.lang.String">
   <column length="64" name="hire_date"/>
  </property>
 </class>
</hibernate-mapping>

и второй файл сопоставления:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping default-lazy="false">
 <class catalog="moi"
  name="com.ebla.moi.correspondence.model.entity.department.Department" table="department">
  <id name="id" type="java.lang.Long">
   <column name="id"/>
   <generator class="identity"/>
  </id>
  <property generated="never" lazy="false" name="name" type="java.lang.String">
   <column length="256" name="name" unique="true"/>
  </property>
  <set inverse="true" name="users" sort="unsorted">
   <key>
    <column name="department_id"/>
   </key>
   <one-to-many class="com.ebla.moi.correspondence.model.entity.user.User"/>
  </set>
 </class>
</hibernate-mapping>

Моя проблема в том, что иногда мне нужно получить сотрудника в его отдел, а в других случаях мне нужна только информация о сотруднике без информации об отделе ..... и то же самое с отделом с сотрудником .... с помощью файл сопоставления над спящим режимом выводит отдел и его пользователей, если мне нужен сотрудник или нет ... как определить свои потребности в спящем режиме, чтобы получить именно то, что мне нужно ...

спасибо

Ответы [ 4 ]

10 голосов
/ 02 февраля 2009

Вы можете отобразить отношение как "ленивое" и написать два запроса, чтобы получить ваши данные:

  • Обычный простой запрос для получения ваших данных («ленивый»). Например. «выберите сотрудника, где ...»

  • Тот же запрос, использующий "fetch join", чтобы Hibernate выбрал "childs". Например. "выберите e из списка Сотрудника, оставленного для получения e.department где ..."

ТОО, Андреа

8 голосов
/ 02 февраля 2009

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

Вы можете использовать метод SetFetchMode ICriteria, чтобы определить, должен ли Департамент быть выбран или нет:

Это позволит убедиться, что Департамент не выбран:

ICriteria crit = theSession.CreateCriteria (typeof(Employee));
crit.SetFetchMode ("Department", FetchMode.Lazy)

С этим кодом будет извлечен отдел.

ICriteria crit = theSession.CreateCriteria (typeof(Employee));
crit.SetFetchMode ("Department", FetchMode.Join)

Некоторые говорят, что рекомендуется использовать режим выборки по умолчанию в сопоставлениях (который будет ленивым, я полагаю) и указывать режим выборки в каждом конкретном сценарии. (То есть в ваших репозиториях).

2 голосов
/ 02 февраля 2009

Один из способов сделать это - создать два класса, представляющих сотрудника:

  • Employee, в котором отображается информация об отделе;
  • EmployeeSummary, который содержит только данные о сотруднике.

Тогда оба класса имеют независимые привязки к таблице employee, но только Employee также имеет отношение к department.

Затем, когда вам нужна вся информация, которую вы загружаете Employee экземпляров, и когда вам просто нужна информация о сотрудниках, вы загружаете EmployeeSummary экземпляров.

Вы можете удалить любое дублирование привязок ORM и бизнес-логики, введя общий суперкласс, такой как AbstractEmployee, для обоих классов сотрудников.

1 голос
/ 26 октября 2012

Я думаю, что вы ищете получить профили , Также посмотрите на этот пример: http://arjan -tijms.omnifaces.org / 2012/04 / fetching-Произвольный объект-графы-в-jpa.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...