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