2009-09-14 7 views
6

Можно ли настроить Hibernate для хранения класса компонента в отдельной таблице?Сопоставление компонентов спящего режима с отдельной таблицей

Рассмотрим следующий пример:

<class name="test.ClassA"> 
    <property name="propA"/> 
    <component name="componentProp" class="test.ClassB"> 
     <property name="propB"/> 
    </component> 
</class> 

Это карты в таблицу под названием MyClass с двумя колоннами propA и propB. Я хочу отобразить свойства компонента в таблице ClassB.

Что я не нужно сделать, это настроить ClassB как объект сам по себе (это не имеет осмысленного идентичности за пределами ClassA), так что исключает нормальную связь. Кроме того, я не могу изменить объектную модель (ее сгенерированный код), поэтому я не могу ввести свойство ID в ClassB.

Это похоже на разрыв в функциональности Hibernate - отображение <> выполняет сопоставление «несколько классов-к-одному» и < join> делает «один-к-нескольким таблицам», но странно нет никакого очевидного способа делать «несколько классов-к-нескольким таблицам», не прибегая к ассоциациям сущностей.

Мое обоснование для этого состоит в том, что я хочу, чтобы моя схема БД была похожа на объектную модель настолько же практичной, что она включала отдельные таблицы для компонента ClassB. Я понимаю, что это не будет масштабироваться - например, вы не могли бы делать вложенные компоненты, но это не проблема в этой конкретной ситуации.

ответ

6

Вы можете использовать <join> и <component> вместе, или я не понял ваш вопрос?

<class name="test.ClassA"> 
    <property name="propA"/> 

    <join table="ClassB"> 
    <key column="ClassA_id" /> 
    <component name="componentProp" class="test.ClassB"> 
     <property name="propB"/> 
    </component> 
    </join> 

</class> 

Хотя вам (очевидно) нужен внешний ключ, его не нужно отображать в объектной модели. Подробности о присоединиться являются here - при условии, для полноты только, я знаю вы знаете, где их можно получить из :-)

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

+0

Ах, это похоже на то, что мне нужно, спасибо за это. Я вытащу ее за спину и посмотрю, это билет. – skaffman

+0

Я нашел этот метод, описанный в разделе 8.1.3 «Сохранение Java с гибернацией». Выглядит. Еще раз спасибо. – skaffman

+0

Спасибо. Мне почему-то не удалось прочитать эту книгу :-) – ChssPly76

Смежные вопросы