1

假设我有一张这样的桌子:

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 查询,等等。

我的问题是我想不出一个不会对我的 HSQLDB 测试代码造成严重破坏的 HBM 映射文件。我的测试设置是一个典型的 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?一般有没有更好的方法来做这个映射?我愿意接受任何建议...

4

1 回答 1

1

没有简单的方法可以从 hbm2ddl 中排除表。但是,您可以通过 Hibernate 的子选择映射您的视图:请参见 5.1.1 下的脚注 #20

就像是:

<class name="com.example.BigPojo" entity-name="bigPojoView"
    <subselect>
      ... your view definition here ...
    </subselect>
    <synchronize table="big_table"/>
    <id name="UUID"/>
    ...
</class>
于 2011-09-29T18:21:50.770 回答