стратегия извлечения гибернации при использовании одной таблицы на наследование иерархии классов - PullRequest
3 голосов
/ 17 мая 2011

Hello Я использую одну таблицу для каждого наследования иерархии классов с устаревшими данными, как описано здесь

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/inheritance.html#inheritance-tableperclass

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

<class abstract="true" name="note" table="NOTES">
 <id name="id" type="long" column="NOTE_ID">
     <generator class="native"/>
 </id>
 <discriminator column="NOTE_TYPE" type="string"/>
 <property name="orderId" column="ORDER_ID"/>
 <property name="text" column="TEXT"/>
 <subclass name="PurchaseNote" discriminator-value="PUR" />
 <subclass name="CancelNote" discriminator-value="CAN" />
 <subclass name="RefundNote" discriminator-value="REF" />
</class>

Для каждого заказа может быть много подклассов заметок

Примечания описываются как ассоциации в Классе заказа, что-то вроде

<class name="order" table="ORDERS">
 <id name="id" type="long" column="ORDER_ID">
     <generator class="native"/>
 </id>
 .....
<set name="purchaseNotes">
    <key column="orderId" />
    <one-to-many class="PurchaseNote"/>
</set>
<set name="cancelNotes">
    <key column="orderId" />
    <one-to-many class="cancelNote"/>
</set>
<set name="refundNotes">
    <key column="orderId" />
    <one-to-many class="refundNote"/>
</set>

</class>

Я могу получить связанные коллекции, извлеченные из Hibernate, если я сделаю следующее.

1) Используйте предложение «Где» в определении набора в порядке xml или же 2) Используйте force = "true" как часть определения дискриминатора в примечаниях xml

Я также могу при вызове DAO через сеанс гибернации из фабрики сеансов использовать HQL "из RefundNote, где orderId =?" или же "из Note note, где note.class = RefundNote и orderId =?" чтобы получить список правильных подклассов RefundNote и заполнить список в классе Order, используя установщик refundNotes.

Все стандартные вещи в спящем режиме?

Любой из этих методов создает коллекции, запускающие 3 запроса (по одному для каждой коллекции) в одну и ту же таблицу. По мере роста числа подклассов это кажется неэффективным ....?

Я много читал, но не вижу способа, чтобы hibernate (через стратегии выборки, соединения, выборки и т. Д.) Мог минимизировать эти вызовы до одного вызова db и по-прежнему заполнять мои коллекции ...? *

Я могу получить все заметки и выполнить итерации в Java для создания коллекций с помощью проверки class.simpleName, но мне было интересно, пропущу ли я что-нибудь, что сделает hibernate .....?

Спасибо за любой совет

1 Ответ

0 голосов
/ 24 мая 2011

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

Альтернативный подход состоит в том, чтобы иметь одну сопоставленную коллекцию гибернации, Notes, а затем иметь переходные поля для refundNotes и т. Д.

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

Таким образом, hibernate сделает один запрос для извлечения заметок, и вы сможете работать с гидратированными объектами по мере необходимости.

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