我可以在Hibernate中映射表和同一个表的视图而不会破坏我的自动化测试吗?

时间:2011-09-29 17:24:15

标签: java hibernate testing hbm2ddl

说我有一张这样的表:

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实体?有没有更好的方法来进行这种映射?我愿意接受任何建议......

1 个答案:

答案 0 :(得分:1)

没有简单的方法可以从hbm2ddl中排除表格。但是,您可以通过Hibernate的子选择来映射您的视图:see footnote #20 under 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>