违反了唯一约束 - 调试

时间:2017-12-13 01:42:20

标签: 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 exception is org.hibernate.exception.ConstraintViolationException: ORA-00001: unique constraint (YYY.XXX_LOG_PK) violated”

代码:

@SequenceGenerator(name = "TT_SEQUENCE_GENERATOR", sequenceName = "YYY.XXX_LOG_SEQ")
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TT_SEQUENCE_GENERATOR")
@Column(name = "ID")
public Long getId() {
    return this.id;
}

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将一些记录插入到数据库中时,它没有给出任何异常。

无论如何我可以调试以找出什么是例外?我也试过show_sql - 我也无法找到解决方案,因为这不会在控制台中打印下一个序列号

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

2 个答案:

答案 0 :(得分:2)

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

  

首先查询sequanence当前值:

SELECT seqname.CURRVAL FROM dual
  

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

ALTER SEQUENCE seqname INCREMENT BY XXXXXX;
SELECT seqname.NEXTVAL FROM dual;

答案 1 :(得分:0)

我找到了解决问题的方法。

问题来自数据库端。我们通过查看迁移文档和检查文件找到了。

@Edwin:感谢您的帮助,您的查询也帮助我找到了问题所在。

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

谢谢大家。