Элегантные способы обработки представлений базы данных в спящих объектах? - PullRequest
25 голосов
/ 23 мая 2009

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

Но до сих пор я не нашел хорошего способа определения дополнительных представлений для таблиц, с которыми сопоставляются мои спящие сущности; Я все еще использую простые сценарии SQL для этого. Есть ли более элегантный способ определения представлений для таблиц, управляемых hibernate?

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

Если есть способ сделать это, то второй проблемой будет получение «синтетических» экземпляров только для чтения из этих представлений, что должно упростить подачу агрегированных данных в пользовательский интерфейс.

EDIT:

Кажется, что я не прояснил проблему достаточно, поэтому вот что я пытаюсь сделать: я хочу написать код, который не зависит от используемой базы данных. Поскольку я использую hibernate, мне просто нужно изменить файл конфигурации диалекта и затем использовать другую СУБД.

Вопрос: как создать представлений на моих спящих объектах без , опираясь на определенный диалект SQL (чтобы все было переносимо) или даже на HQL? И если это возможно, могу ли я использовать HQL для запроса этих представлений, то есть для создания агрегатных сущностей только для чтения? Есть ли дополнительный плагин Hibernate, чтобы помочь мне с этим? Пока ничего не нашел ...: - /

Ответы [ 4 ]

22 голосов
/ 27 мая 2009

Hibernate не будет автоматически создавать представления для вас, так как каждый диалект поддерживает только ограниченное подмножество языка определения данных (DDL) базовой базы данных. По сути, он поддерживает достаточно DDL для создания рабочей схемы, но недостаточно для создания «дополнительных» объектов, таких как представления.

Однако еще не все потеряно. Hibernate дает вам возможность создавать (и удалять) дополнительные объекты базы данных самостоятельно в файлах сопоставления XML, и эти объекты можно ограничить определенным диалектом. Например, у меня могло бы быть отображение как это:

<hibernate-mapping>
  <class name='com.mycompany.myproduct.Customer' table='tbl_customer'>
    <id name='id' column='customer_id'>
      <generator class='native'/>
    </id>
    <property name='name' length='50' unique='true' not-null='true' />
  </class>

  <database-object>
    <create>create or replace view read_only_cust...</create>
    <drop>drop view read_only_cust</drop>
    <dialect-scope name='org.hibernate.dialect.Oracle9Dialect' />
  </database-object>
</hibernate-mapping>

Вы можете свободно создавать любые дополнительные представления, добавляя дополнительные разделы "объект базы данных". Вы должны сами написать SQL (DDL) для каждой базы данных, которую хотите поддерживать, но, поскольку они ограничены диалектом, Hibernate будет выполнять SQL только для диалекта, выбранного во время экспорта схемы.

12 голосов
/ 07 октября 2009

Была такая же проблема и нашел следующее решение в спящем разделе:

Нет разницы между видом и базовый стол для Hibernate отображение. Это прозрачно на уровень базы данных, хотя некоторые СУБД не поддерживает взгляды должным образом, особенно с обновлениями. Иногда вы хотите использовать представление, но вы не можете создать его в базе данных (т.е. с наследием схемы). В этом случае вы можете отобразить неизменяемый и доступный только для чтения объект заданное выражение подвыбора SQL:

<class name="Summary">
    <subselect>
        select item.name, max(bid.amount), count(*)
        from item
        join bid on bid.item_id = item.id
        group by item.name
    </subselect>
    <synchronize table="item"/>
    <synchronize table="bid"/>
    <id name="name"/>
    ...
</class>

https://docs.jboss.org/hibernate/stable/core/manual/en-US/html_single/#mapping-declaration

0 голосов
/ 26 мая 2009

Что вы подразумеваете под «создать вид»? Я знаю, что это означает из чистого контекста БД - но это не то, что вы имеете в виду - верно?

Вы можете либо сопоставить новые классы Java с теми же таблицами, чтобы создать «представление», либо использовать HQL для выбора подмножества столбцов, отображаемых другими постоянными классами.

НТН

0 голосов
/ 26 мая 2009

Можете ли вы объявить представления непосредственно внутри базы данных? Тогда вы можете просто выбрать прямо из представлений. Взгляните на главу 10.4.4 руководства Hibernate

Это должно позволить вам ВЫБРАТЬ из представления базы данных и заставить Hibernate автоматически гидрировать данные в ваших сущностях.

Конечно, представление не принимает никаких параметров. Hibernate 3 должен поддерживать хранимые процедуры, но я использовал это.

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