Java 违反唯一约束-调试

Java 违反唯一约束-调试,java,oracle,jpa,sequence,Java,Oracle,Jpa,Sequence,我们有一个已经运行多年的应用程序,我们也在使用同一个oracle数据库。但是将我们的数据库从一台主机迁移到另一台主机 DB:ORACLE 现在我们突然遇到了以下例外情况 “org.springframework.dao.DataIntegrityViolationException: ORA-00001: unique constraint (YYY.XXX_LOG_PK) violated; SQL [n/a]; constraint [YYY.XXX_LOG_PK]; nested exc

我们有一个已经运行多年的应用程序,我们也在使用同一个oracle数据库。但是将我们的数据库从一台主机迁移到另一台主机

DB:ORACLE

现在我们突然遇到了以下例外情况

“org.springframework.dao.DataIntegrityViolationException: ORA-00001: unique constraint (YYY.XXX_LOG_PK) violated; 
SQL [n/a]; constraint [YYY.XXX_LOG_PK]; nested exception is org.hibernate.exception.ConstraintViolationException: ORA-00001: unique constraint (YYY.XXX_LOG_PK) violated”
代码:

以DB为单位的序列:

CREATED 07-NOV-17
LAST_DDL_TIME   07-NOV-17
SEQUENCE_OWNER  TT
SEQUENCE_NAME   YYY.XXX_LOG_SEQ
MIN_VALUE   1
MAX_VALUE   999999999999999999999999999
INCREMENT_BY    1
CYCLE_FLAG  N
ORDER_FLAG  N
CACHE_SIZE  0
LAST_NUMBER 75305
问题: 当我们试图通过JPA代码插入一些记录时,我们得到了上面的异常,但是当我试图使用sequence.nextval将一些记录插入DB时,它没有给出任何异常

我是否可以调试以找出异常情况?我还尝试了show_sql-我也找不到这个解决方案,因为它不会在控制台中打印下一个序列号


如果您知道解决方案,请给我指出正确的方向。

自增强序列遇到唯一约束冲突的最常见场景是数据迁移时,导致数据的最大值超过序列值

首先查询序列当前值:

然后修改序列值,以确保序列的nextval超过数据的当前最大值


自增强序列遇到唯一约束冲突的最常见场景是数据迁移时,导致数据的最大值超过序列值

首先查询序列当前值:

然后修改序列值,以确保序列的nextval超过数据的当前最大值


我为我们面临的问题找到了解决办法

问题出在数据库端。通过查看迁移文档和检查文件,我们发现了这一点

@埃德温:谢谢你的帮助,你的询问也帮助我找到了问题所在

执行迁移时,序列没有从旧服务器复制到新服务器。当我们复制到新服务器时,一切正常


谢谢大家。

我找到了解决我们面临问题的办法

问题出在数据库端。通过查看迁移文档和检查文件,我们发现了这一点

@埃德温:谢谢你的帮助,你的询问也帮助我找到了问题所在

执行迁移时,序列没有从旧服务器复制到新服务器。当我们复制到新服务器时,一切正常


谢谢大家。

Oracle数据库上的原始插入没有发生错误,这使得这个问题更加隐蔽。Hibernate是否有可能在幕后创建一个或多个连接表,而这正是实际发生错误的地方?我不认为有可能多次调用Hibernate。。。。但是正确的一点是,我将通过放置show_sql来检查它。如果Oracle数据库中的原始插入没有发生错误,那么这个问题将更加隐蔽。Hibernate是否有可能在幕后创建一个或多个连接表,而这正是实际发生错误的地方?我不认为有可能多次调用Hibernate。。。。但正确的一点是,我将通过放置show_sql.CURRVAL来检查它,它只返回同一会话中上一个NEXTVAL调用的最后一个值。我们需要检查所有_序列的实际值。LAST_NUMBER.CURRVAL只返回同一会话中上一个NEXTVAL调用的最后一个值。我们需要检查所有_序列的实际值。最后一个_编号。
CREATED 07-NOV-17
LAST_DDL_TIME   07-NOV-17
SEQUENCE_OWNER  TT
SEQUENCE_NAME   YYY.XXX_LOG_SEQ
MIN_VALUE   1
MAX_VALUE   999999999999999999999999999
INCREMENT_BY    1
CYCLE_FLAG  N
ORDER_FLAG  N
CACHE_SIZE  0
LAST_NUMBER 75305
SELECT seqname.CURRVAL FROM dual
ALTER SEQUENCE seqname INCREMENT BY XXXXXX;
SELECT seqname.NEXTVAL FROM dual;