我目前正在为基于Spring的插件系统开发原型。这个想法是插件可以使用JPA实体和liquibase更改日志来维护数据库结构。为了将插件创建的表与核心系统的表分开,应强制插件使用表名前缀。
对于JPA / Hibernate,可以使用命名策略轻松归档。但我发现没有办法归档liquibase变更集。
例如,该插件定义了一个更改日志,如下所示
<changeSet id="2015-03-17-00-01" author="foo">
<createTable tableName="fooentity">
<column name="id" type="INT">
<constraints primaryKey="true" nullable="false" />
</column>
<column name="name" type="VARCHAR(100)">
<constraints nullable="false" />
</column>
</createTable>
</changeSet>
应使用名称&#34; plugin_fooentity&#34;创建表格。插件本身不应该知道关于前缀的任何信息,因为前缀是由插件/核心系统提供的。
如果有人可以给我一个可能解决方案的提示,那就太棒了。
答案 0 :(得分:2)
也许你可以使用modifySql
吗?
您必须将此复制到您定义的所有更改集,但应该可以。
它有一个名为regExpReplace
的子标签,您可以使用它来定义create table (\w*?) .*
等通用术语,并将其替换为create table plugin_$1
。
答案 1 :(得分:0)
对我来说,它像这样工作:
使用ModifySql语句
我创建了2个属性:
<property name="table.prefix" value="TBL_"/>
<property name="schema.name" value="PUBLIC"/>
然后添加了以下语句:
<modifySql>
<regExpReplace replace="CREATE\ TABLE\ ${schema.name}.([\w]*)\ (.*)" with="CREATE TABLE ${schema.name}.${table.prefix}$1 $2"/>
</modifySql>
<modifySql>
<regExpReplace replace="CREATE\ UNIQUE\ INDEX\ ${schema.name}.([\w]*)\ ON\ PUBLIC.([\w]*)\((.*)\)" with="CREATE UNIQUE INDEX ${schema.name}.$1 ON ${schema.name}.${table.prefix}$2($3)"/>
</modifySql>
<modifySql>
<regExpReplace replace="CREATE\ INDEX\ ${schema.name}.([\w]*)\ ON\ ${schema.name}.([\w]*)\((.*)\)" with="CREATE INDEX ${schema.name}.$1 ON ${schema.name}.${table.prefix}$2($3)"/>
</modifySql>