Liquibase 忽略 Oracle 数据库的 autoIncrement="true"
Liquibase ignores autoIncrement="true" for Oracle DB
我通过 Hibernate 生成的 DDL 生成了 schema/tables,这是正确的:
create table cat_component.organisation (
id number(19,0) generated as identity,
archived number(1,0),
is_in_avaloq_group number(1,0) not null,
mdm_uuid varchar2(255 char),
name varchar2(255 char),
primary key (id)
)
之后,我尝试生成如下所示的 Liquibase 变更日志:
<changeSet author="blabla (generated)" id="1582733383680-5">
<createTable tableName="organisation">
<column autoIncrement="true" name="id" type="NUMBER(19, 0)">
<constraints primaryKey="true" primaryKeyName="organisationPK"/>
</column>
<column name="archived" type="NUMBER(1, 0)"/>
<column name="is_in_avaloq_group" type="NUMBER(1, 0)">
<constraints nullable="false"/>
</column>
<column name="mdm_uuid" type="VARCHAR2(255 CHAR)"/>
<column name="name" type="VARCHAR2(255 CHAR)"/>
</createTable>
</changeSet>
问题是,如果我尝试 运行 liquibase 更新日志,它会 运行 将 XML 定义变成这样:
2020-02-26 16:15:10.779 INFO 8064 --- [main] liquibase.executor.jvm.JdbcExecutor : CREATE TABLE CAT_COMPONENT.organisation (id NUMBER(19, 0) NOT NULL, archived NUMBER(1, 0), is_in_avaloq_group NUMBER(1, 0) NOT NULL, mdm_uuid VARCHAR2(255 CHAR), name VARCHAR2(255 CHAR), CONSTRAINT organisationPK PRIMARY KEY (id))
2020-02-26 16:15:10.787 INFO 8064 --- [main] liquibase.changelog.ChangeSet : Table 组织已创建
2020-02-26 16:15:10.787 INFO 8064 --- [main] liquibase.changelog.ChangeSet:ChangeSet 类路径:/db/changelog/db.changelog-master.xml::1582733383680-5::blabla (生成)运行 在 9 毫秒内成功
您可能已经注意到,缺少 "generated as identity",这
让我相信无论出于何种原因, autoIncrement="true"
被忽略。
我使用 Oracle 12.1.0.2 和 org.liquibase:liquibase-core 3.8.2。
OJDBC 驱动程序版本为 19.3.0.0。
gradle 属性是:
spring.datasource.url=jdbc:oracle:thin:@//host:1522/SID
spring.datasource.driverClassName=oracle.jdbc.OracleDriver
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.datasource.username=user
spring.datasource.password=pass
spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect
spring.jpa.show-sql=true
logging.level.org.hibernate.SQL=debug
logging.level.org.hibernate.type=trace
spring.datasource.continue-on-error=true
spring.datasource.platform=oracle
spring.liquibase.url=${spring.datasource.url}
spring.liquibase.user=${spring.datasource.username}
spring.liquibase.password=${spring.datasource.password}
spring.liquibase.url=${spring.datasource.url}
spring.liquibase.user=${spring.datasource.username}
spring.liquibase.password=${spring.datasource.password}
spring.liquibase.change-log=classpath:/db/changelog/db.changelog-master.xml
spring.liquibase.default-schema=${spring.jpa.properties.hibernate.default_schema}
spring.liquibase.liquibase-schema=${spring.jpa.properties.hibernate.default_schema}
我在网上看过,我知道我的 Oracle 版本与此列类型兼容,我不需要创建额外的 oracle 序列。
任何线索可能是什么问题?
更正 autoIncrement="true"
由于 Oracle 端缺少对自动递增列的支持而被忽略的问题,如 liquienter link description here:
的文档中所示
Is column an auto-increment column. Ignored on databases that do not
support autoincrement/identity functionality.
您将需要 create a sequence 来生成 ID 并在插入数据时向 id
列提供序列,即使用 hibernate
:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XXX_ID_GEN")
@SequenceGenerator(name = "XXX_ID_GEN", sequenceName = "SEQ_XXX")
long id;
这似乎是 Liquibase 中的一个错误。我刚刚在这里找到它 https://liquibase.jira.com/projects/CORE/issues/CORE-3524?filter=allissues&orderby=updated%20DESC&keyword=Oracle
如其所述,有一种变通方法可以添加
generationType="BY DEFAULT"
在每个列定义中,使用了 autoIncrement="true"。
我通过 Hibernate 生成的 DDL 生成了 schema/tables,这是正确的:
create table cat_component.organisation (
id number(19,0) generated as identity,
archived number(1,0),
is_in_avaloq_group number(1,0) not null,
mdm_uuid varchar2(255 char),
name varchar2(255 char),
primary key (id)
)
之后,我尝试生成如下所示的 Liquibase 变更日志:
<changeSet author="blabla (generated)" id="1582733383680-5">
<createTable tableName="organisation">
<column autoIncrement="true" name="id" type="NUMBER(19, 0)">
<constraints primaryKey="true" primaryKeyName="organisationPK"/>
</column>
<column name="archived" type="NUMBER(1, 0)"/>
<column name="is_in_avaloq_group" type="NUMBER(1, 0)">
<constraints nullable="false"/>
</column>
<column name="mdm_uuid" type="VARCHAR2(255 CHAR)"/>
<column name="name" type="VARCHAR2(255 CHAR)"/>
</createTable>
</changeSet>
问题是,如果我尝试 运行 liquibase 更新日志,它会 运行 将 XML 定义变成这样:
2020-02-26 16:15:10.779 INFO 8064 --- [main] liquibase.executor.jvm.JdbcExecutor : CREATE TABLE CAT_COMPONENT.organisation (id NUMBER(19, 0) NOT NULL, archived NUMBER(1, 0), is_in_avaloq_group NUMBER(1, 0) NOT NULL, mdm_uuid VARCHAR2(255 CHAR), name VARCHAR2(255 CHAR), CONSTRAINT organisationPK PRIMARY KEY (id))
2020-02-26 16:15:10.787 INFO 8064 --- [main] liquibase.changelog.ChangeSet : Table 组织已创建 2020-02-26 16:15:10.787 INFO 8064 --- [main] liquibase.changelog.ChangeSet:ChangeSet 类路径:/db/changelog/db.changelog-master.xml::1582733383680-5::blabla (生成)运行 在 9 毫秒内成功
您可能已经注意到,缺少 "generated as identity",这 让我相信无论出于何种原因, autoIncrement="true" 被忽略。
我使用 Oracle 12.1.0.2 和 org.liquibase:liquibase-core 3.8.2。 OJDBC 驱动程序版本为 19.3.0.0。 gradle 属性是:
spring.datasource.url=jdbc:oracle:thin:@//host:1522/SID
spring.datasource.driverClassName=oracle.jdbc.OracleDriver
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.datasource.username=user
spring.datasource.password=pass
spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect
spring.jpa.show-sql=true
logging.level.org.hibernate.SQL=debug
logging.level.org.hibernate.type=trace
spring.datasource.continue-on-error=true
spring.datasource.platform=oracle
spring.liquibase.url=${spring.datasource.url}
spring.liquibase.user=${spring.datasource.username}
spring.liquibase.password=${spring.datasource.password}
spring.liquibase.url=${spring.datasource.url}
spring.liquibase.user=${spring.datasource.username}
spring.liquibase.password=${spring.datasource.password}
spring.liquibase.change-log=classpath:/db/changelog/db.changelog-master.xml
spring.liquibase.default-schema=${spring.jpa.properties.hibernate.default_schema}
spring.liquibase.liquibase-schema=${spring.jpa.properties.hibernate.default_schema}
我在网上看过,我知道我的 Oracle 版本与此列类型兼容,我不需要创建额外的 oracle 序列。 任何线索可能是什么问题?
更正 autoIncrement="true"
由于 Oracle 端缺少对自动递增列的支持而被忽略的问题,如 liquienter link description here:
Is column an auto-increment column. Ignored on databases that do not support autoincrement/identity functionality.
您将需要 create a sequence 来生成 ID 并在插入数据时向 id
列提供序列,即使用 hibernate
:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XXX_ID_GEN")
@SequenceGenerator(name = "XXX_ID_GEN", sequenceName = "SEQ_XXX")
long id;
这似乎是 Liquibase 中的一个错误。我刚刚在这里找到它 https://liquibase.jira.com/projects/CORE/issues/CORE-3524?filter=allissues&orderby=updated%20DESC&keyword=Oracle
如其所述,有一种变通方法可以添加
generationType="BY DEFAULT"
在每个列定义中,使用了 autoIncrement="true"。