额外 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 exitscreate 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>