Можно ли сопоставить таблицу и представление одной и той же таблицы в Hibernate, не нарушая мои автоматизированные тесты? - PullRequest
1 голос
/ 29 сентября 2011

Допустим, у меня есть такая таблица:

CREATE TABLE big_table (UUID varchar(32) not null, ... );

У меня есть запрос к таблице, который я не могу выразить как запрос HQL или Criteria.Я пытаюсь настроить запрос как представление в Oracle, например, так:

CREATE VIEW big_table_view AS SELECT bt.* FROM big_table bt
    LEFT OUTER JOIN ...
        -- (multicolumn subselect over big_table for some historical stuff)
    WHERE ...

Я пытаюсь сопоставить один и тот же класс Java и с таблицей, и с представлением.Это было бы здорово, потому что тогда я мог бы выполнять одинаковые запросы Criteria для обоих и т. Д.

Моя проблема в том, что я не могу создать файл отображения HBM, который не наносит ущерб моему тесту HSQLDBкод.Моя тестовая установка - это типичная тестовая установка Maven / Spring с hibernate.hbm2ddl.auto, установленным на create-drop, так что Hibernate создает схему HSQLDB на лету для тестирования.

Мой файл отображения в настоящее время выглядит следующим образом:

<hibernate-mapping>
    <class name="com.example.BigPojo" entity-name="bigPojo"
            table="big_table">
        &commonPropertiesEntity;
    </class>

    <class name="com.example.BigPojo" entity-name="bigPojoView"
            table="big_table_view">
        &commonPropertiesEntity;
    </class>
</hibernate-mapping>

... когда я запускаю свои тесты, они взрываются повсюду, потому что HSLQDB пытается создать таблицу с именем big_table_view со всеми теми же ограничениями внешнего ключа, индексами и т. Д. Я пытаюсьисправить схему после того, как она была создана с помощью элемента database-object, например:

<database-object>
    <create>
        DROP TABLE big_table_view CASCADE;
        CREATE VIEW big_table_view...
    </create>
    <drop>
        DROP VIEW big_table_view IF EXISTS;
    </drop>
    <dialect-scope name="org.hibernate.dialect.HSQLDialect" />
</database-object>

... но все еще что-то ломается, и я все еще пытаюсь разобраться.Есть ли способ сообщить Hibernate об исключении сущности bigPojoView из hbm2ddl?Есть ли лучший способ сделать это отображение вообще?Я открыт для любых советов ...

1 Ответ

1 голос
/ 29 сентября 2011

Нет простого способа исключить таблицу из hbm2ddl. Однако вы можете отобразить свой вид с помощью подвыбора Hibernate: см. Сноску № 20 в разделе 5.1.1 .

Что-то вроде:

<class name="com.example.BigPojo" entity-name="bigPojoView"
    <subselect>
      ... your view definition here ...
    </subselect>
    <synchronize table="big_table"/>
    <id name="UUID"/>
    ...
</class>
...