额外 DDL
我们使用 src/main/resources/extra-ddl.xml
为视图、存储过程和有时是索引等内容提供额外的 DDL - 实际上是任何未通过映射注释生成的 DDL。
然后,extra-ddl 中的 DDL 将作为常规测试的一部分(在 dropCreate
之后运行)和数据库迁移的一部分(作为可重复迁移)运行。
最佳实践
在使用 extra-ddl.xml
时,有一些值得遵循的实践
- 使用数字(例如 1、2、3 ...)作为脚本名称的前缀,以有效地按顺序执行可重复迁移。
-
不要将所有 DDL 放入单个大型
ddl-script
条目中。相反,将 ddl 分组到ddl-script
条目中,以便一起删除和重新创建。如果我们想要单独删除和重新创建某个内容,则需要将其放入其自己的ddl-script
条目中。
视图
要定义数据库视图,然后可以通过 @View
在实体 Bean 上使用它们,我们应该将 ddl-script
元素添加到 extra-ddl.xml 中以创建视图。每个条目都应该允许重新创建视图,因此通常包括 drop view if exits
和 create view
语句。
每个条目都成为一个“可重复”迁移,并且会在其内容的哈希值发生更改时运行,并在所有常规“版本”迁移之后运行。
请注意,在自己的 ddl-script
中创建视图或在其自己的 ddl-script
中包含依赖视图(一起 [删除] 和创建的视图)被认为是最佳实践。
示例
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<extra-ddl xmlns="http://ebean-orm.github.io/xml/ns/extraddl">
<ddl-script name="1 product view">
drop view if exists product_vw cascade;
create view product_vw as
...;
</ddl-script>
<ddl-script name="2 promotion views">
-- 2 related/dependent views that drop and create together
drop view if exists promotion_minprice_vw cascade;
drop view if exists promotion_vw cascade;
create view promotion_vw as
...;
create view promotion_minprice_vw as
...;
</ddl-script>
</extra-ddl>
存储过程和触发器
对于存储过程和触发器,请为相关对象添加一个 ddl-script
。请注意,为了支持多个数据库,我们通常指定 platforms
属性。
示例
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<extra-ddl xmlns="http://ebean-orm.github.io/xml/ns/extraddl">
<ddl-script name="3 store price trigger" platforms="postgres">
create or replace function trigger_store_price_log() returns trigger as $$
begin
...;
end;
$$ LANGUAGE plpgsql;
create trigger trg_store_price_log
before update on store_price
for each row execute procedure trigger_store_price_log();
</ddl-script>
</extra-ddl>
任何 DDL
请注意,对于我们可以放入 extra-ddl.xml
的 DDL 没有限制。我们对未建模和未由注释生成的 DDL 使用 extra-dll。例如,我们通常不希望对 CREATE TABLE
语句使用 extra-ddl,因为该 DDL 是从映射注释 @Table
等生成的。
特定于平台的 DDL
为了支持多个数据库平台,我们通过 platforms
属性指定 DDL 适用的数据库平台。
我们可以对不同的 platforms
使用相同的脚本 name
来处理视图、存储过程等的数据库特定语法。
示例
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<extra-ddl xmlns="http://ebean-orm.github.io/xml/ns/extraddl">
<ddl-script name="5 order agg view" platforms="h2">
-- h2 specific DDL
drop view order_agg_vw;
create view order_agg_vw as
...;
</ddl-script>
<ddl-script name="5 order agg view" platforms="postgres,mysql,db2">
-- DLL for postgres, mysql and db2
create or replace view order_agg_vw as
...
</ddl-script>
</extra-ddl>