Подтвердить что ты не робот

Элегантные способы обработки представлений базы данных для объектов спящего режима?

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

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

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

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

EDIT:

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

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

4b9b3361

Ответ 1

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 для диалекта, выбранного во время экспорта схемы.

Ответ 2

Имел ту же проблему и нашел следующее решение в ожидании спящего режима:

Нет никакой разницы между представлением и базовый стол для спящего режима отображение. Это прозрачно на уровень базы данных, хотя некоторые СУБД делают не поддерживает взгляды должным образом, особенно с обновлениями. Иногда вы хотите используйте представление, но вы не можете создать его в базе данных (т.е. с наследием схемы). В этом случае вы можете сопоставить неизменяемый и доступный только для чтения объект заданное выражение subselect 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

Ответ 3

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

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

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

Ответ 4

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

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

НТН