最近,我将一个服务从Quarkus 2.7迁移到了最新版本3.2.0.Final。迁移过程进行得很顺利,项目构建也很成功。但是,我在尝试将数据写入PostgreSQL数据库时遇到了一个问题。一开始,我面对的错误是:
Caused by: org.postgresql.util.PSQLException: ERROR: relation "public.revinfo_seq" does not exist
Position: 16
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2675)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2365)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:355)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:490)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:408)
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:166)
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:118)
at io.agroal.pool.wrapper.PreparedStatementWrapper.executeQuery(PreparedStatementWrapper.java:78)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:
字符串
为了解决这个问题,我将当前序列从info_rev_seq
重命名为revinfo_seq
,因为Hibernate 6在序列命名策略https://jpa-buddy.com/blog/hibernate6-whats-new-and-why-its-important/中引入了一个更改
修复序列名后,上述问题得到解决。然而,我发现了另一个问题,出现了一段时间后。
我遇到以下错误:
org.hibernate.exception.ConstraintViolationException: could not execute statement [ERROR: duplicate key value violates unique constraint "pk_revinfo"
Detail: Key (rev)=(60) already exists.] [insert into public.REVINFO (REVTSTMP,REV) values (?,?)]
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:95)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:56)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:108)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:278)
at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.performNonBatchedMutation(AbstractMutationExecutor.java:108)
at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:40)
at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:53)
at org.hibernate.persister.entity.mutation.InsertCoordinator.doStaticInserts(InsertCoordinator.java:170)
at org.hibernate.persister.entity.mutation.InsertCoordinator.coordinateInsert(InsertCoordinator.java:112)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2761)
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:102)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:606)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:358)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127)
...
Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "pk_revinfo"
Detail: Key (rev)=(60) already exists.
型revinfo
表的结构如下所示:
create table revinfo
(
rev bigserial,
revtstmp bigint
);
alter table revinfo
add constraint pk_revinfo
primary key (rev);
型
经过调查,很明显,序列变得不同步。例如,revinfo
表包含54行,但sequence
得值为23.我手动修复了序列以与正确的值对齐,但它最终再次失去同步。
该问题似乎与序列同步有关。虽然具体原因尚未确定,但事务回滚、并发操作或不正确的序列管理等因素可能会导致该问题。
我怀疑到Quarkus 3.2.0.Final
的迁移可能影响了行为,因为在迁移之前序列同步工作正常。
我还使用Hibernate Envers来审计我的表,包括revinfo
表。但是,由于即使没有引用主表中的revinfo
表也会出现问题,因此问题似乎出在序列同步上,而不是审计本身。
是否有人遇到过类似的问题,并能提供解决问题和确定其根本原因的建议?在解决上述序列同步问题时,您的见解和建议将非常感谢。
请随时分享任何有助于有效排除故障和解决问题的经验或建议。提前感谢您的帮助
P.S.正在使用的数据库是PostgreSQL
2条答案
按热度按时间xmq68pz91#
我强烈建议您查看此迁移指南https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.0:-Hibernate-ORM-5-to-6-migration
您遇到的问题最有可能来自于此特定更改,其中默认增量大小从1更改为50。
您可以尝试显式地将增量大小设置回1,看看是否有帮助。
ltskdhd12#
您应该将序列的增量大小设置为50。
参见https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.0:-Hibernate-ORM-5-to-6-migration#sequence-increment-size:
使用DDL(SQL,如
alter sequence […]
)将序列的增量大小设置为正确的值,即设置为标识符生成器的分配大小,自Hibernate ORM 6起默认为50。