HIbernate загрузить отношения с глубиной 2 - PullRequest
0 голосов
/ 03 февраля 2012

У меня есть 3 класса
В Class1 есть список с элементами класса 2.
Это отображается через объединяемую таблицу (не может быть сопоставлено с внешним ключом, потому что ключ не будет уникальным)!

Class2 имеет внешний ключ класса 3.
Class3 не сохраняет ничего из этого отношения.

Все выглядит примерно так:

  Class1             Class1-2 jointable          Class2
+-----------+   +-----------+-----------+   +-----------+-----------+
| Class1_ID |   | Class1_ID | Class2_ID |   | Class2_ID | Class3_ID |
+-----------+   +-----------+-----------+   +-----------+-----------+
| 1         |   | 1         | 3         |   | 3         | 10        |
| 2         |   | 2         | 7         |   | 7         | 3         |
| ...       |   | ...       | ...       |   | ...       | ...       |
+-----------+   +-----------+-----------+   +-----------+-----------+

 Class3
+-----------+
| Class3_ID |
+-----------+
| 10        |
| 3         |
| ...       |
+-----------+

отображение выглядит так:

Class1: 
List<Class2> class2;

<bag name="class2" cascade="all" table="Class1_Class2" lazy="false" access="field">
     <key column="Class1_ID" />
        <many-to-many class="Class2" column="Class2_ID"/>

Class2: 
Class3 class3

<many-to-one name="class3" class="Class3" column="Class3_ID" fetch="join" unique="false"/>

Поэтому, когда я загружаюЭлемент class1 с session.load (Class1.class, id) Я получаю объект.НО!
Я могу получить доступ к class1.class2 (Список элементов), но когда я пытаюсь получить доступ к class1.class2.class3, это дает мне исключение, что отложенная загрузка не может быть выполнена из-за отсутствия сеанса.
Из-замоя структура данных Я не могу открыть сеанс в этот момент.
Мне нужно загрузить все с одним доступом к БД.

Итак, теперь мой вопрос: могу ли я изменить отображение, чтобы все загрузилось сразу?И если я не могу, как я могу загрузить все в 1 сеанс и вернуть объект типа class1, где я могу получить доступ к class1.class2.class3?Спасибо

1 Ответ

0 голосов
/ 04 февраля 2012

Я не знаком с конфигурацией (синтаксисом) XML, но вы не можете использовать определение отношения между Class2 и Class3 так же нетерпеливо, как вы это сделали с отношением между Class1 и Class2 (lazy=false)?fetch="join" следует установить это значение автоматически, но, очевидно, оно не выполняется таким образом.

(Я не скажу вам, что если вы прикоснетесь к объектам, находящимся в сеансе, его загрузят(например, class1.getClass2().getClass3() // Slightly different in your case because of many-to-many), потому что это было бы хаком.)

Это отображается через объединяемую таблицу (не может быть сопоставлено с внешним ключом, потому что ключ не будет уникальным)!

Вы можете установить ограничение unique для ключевого столбца через Hibernate.Тогда может быть даже возможно выбрать все одним оператором и объединениями (что автоматически должно вызывать желание).

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