使用 envers 的应用程序在架构验证时失败:REV 列的类型错误 - 找到 [int8 (Types#BIGINT)],但期望 [int4 (Types#INTEGER)]
Application with envers fails on schema vaildation: REV column is of wrong type - found [int8 (Types#BIGINT)], but expecting [int4 (Types#INTEGER)]
我有两个 Spring 引导应用程序使用同一个数据库。主应用程序完全使用数据库,另一个应用程序用于报告(基本上读取主应用程序创建的数据)。
主应用程序使用 envers (org.hibernate:hibernate-envers:5.3.1.Final),它创建审计表来跟踪更改(表由 liquibase 创建)。我需要通过报告应用程序读取历史数据,因此我也向该应用程序添加了 envers。以下是报告应用程序的一些片段。
实体示例:
@Entity
@Table(name = "applications")
@Audited
@AuditOverride(forClass = BaseEntity.class)
@EqualsAndHashCode(callSuper = true)
@Getter
public class ApplicationEntity extends BaseEntity {
@ManyToOne(optional = false)
@JoinColumn(name = "client_id")
private ClientEntity client;
private BigDecimal amount;
}
超类:
@MappedSuperclass
@EntityListeners({PreventModificationsListener.class})
@ToString(of = "id")
@EqualsAndHashCode(of = "id")
@Getter
public abstract class BaseEntity {
@VisibleForTesting
@Setter(PACKAGE)
@Id
private Long id;
@Version
private Long version;
}
配置:
spring:
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQL95Dialect
id:
new_generator_mappings: true
defaultSchema: public
order_updates: true
jdbc:
fetch_size: 0
hbm2ddl:
auto: validate
show_sql: false
format_sql: false
enable_lazy_load_no_trans: true
org.hibernate:
envers:
audit_table_prefix: audit_
audit_table_suffix:
因此报告应用程序在模式验证启动期间失败:
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [rev] in table [audit_xyz]; found [int8 (Types#BIGINT)], but expecting [int4 (Types#INTEGER)]
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateColumnType(AbstractSchemaValidator.java:159)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateTable(AbstractSchemaValidator.java:143)
at org.hibernate.tool.schema.internal.GroupedSchemaValidatorImpl.validateTables(GroupedSchemaValidatorImpl.java:42)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.performValidation(AbstractSchemaValidator.java:89)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.doValidation(AbstractSchemaValidator.java:68)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:191)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:939)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390)
... 136 common frames omitted
非常感谢任何帮助和建议。
我的一位同事指出了两个应用程序之间的差异,结果是缺失的 link。
修订实体class:
@Entity
@Table(name = "audit_revisions")
@SequenceGenerator(name = "seq_gen", sequenceName = "audit_revisions_seq", allocationSize = 1)
@RevisionEntity
@EntityListeners(AuditingEntityListener.class)
@Getter
public class AuditRevision {
@Id
@GeneratedValue(generator = "seq_gen", strategy = SEQUENCE)
@RevisionNumber
private Long id;
@RevisionTimestamp
private Date revisionDate;
@CreatedBy
private String createdBy;
}
我有两个 Spring 引导应用程序使用同一个数据库。主应用程序完全使用数据库,另一个应用程序用于报告(基本上读取主应用程序创建的数据)。
主应用程序使用 envers (org.hibernate:hibernate-envers:5.3.1.Final),它创建审计表来跟踪更改(表由 liquibase 创建)。我需要通过报告应用程序读取历史数据,因此我也向该应用程序添加了 envers。以下是报告应用程序的一些片段。
实体示例:
@Entity
@Table(name = "applications")
@Audited
@AuditOverride(forClass = BaseEntity.class)
@EqualsAndHashCode(callSuper = true)
@Getter
public class ApplicationEntity extends BaseEntity {
@ManyToOne(optional = false)
@JoinColumn(name = "client_id")
private ClientEntity client;
private BigDecimal amount;
}
超类:
@MappedSuperclass
@EntityListeners({PreventModificationsListener.class})
@ToString(of = "id")
@EqualsAndHashCode(of = "id")
@Getter
public abstract class BaseEntity {
@VisibleForTesting
@Setter(PACKAGE)
@Id
private Long id;
@Version
private Long version;
}
配置:
spring:
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQL95Dialect
id:
new_generator_mappings: true
defaultSchema: public
order_updates: true
jdbc:
fetch_size: 0
hbm2ddl:
auto: validate
show_sql: false
format_sql: false
enable_lazy_load_no_trans: true
org.hibernate:
envers:
audit_table_prefix: audit_
audit_table_suffix:
因此报告应用程序在模式验证启动期间失败:
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [rev] in table [audit_xyz]; found [int8 (Types#BIGINT)], but expecting [int4 (Types#INTEGER)]
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateColumnType(AbstractSchemaValidator.java:159)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateTable(AbstractSchemaValidator.java:143)
at org.hibernate.tool.schema.internal.GroupedSchemaValidatorImpl.validateTables(GroupedSchemaValidatorImpl.java:42)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.performValidation(AbstractSchemaValidator.java:89)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.doValidation(AbstractSchemaValidator.java:68)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:191)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:939)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390)
... 136 common frames omitted
非常感谢任何帮助和建议。
我的一位同事指出了两个应用程序之间的差异,结果是缺失的 link。
修订实体class:
@Entity
@Table(name = "audit_revisions")
@SequenceGenerator(name = "seq_gen", sequenceName = "audit_revisions_seq", allocationSize = 1)
@RevisionEntity
@EntityListeners(AuditingEntityListener.class)
@Getter
public class AuditRevision {
@Id
@GeneratedValue(generator = "seq_gen", strategy = SEQUENCE)
@RevisionNumber
private Long id;
@RevisionTimestamp
private Date revisionDate;
@CreatedBy
private String createdBy;
}