我们有一个工作多年的应用程序,我们也使用相同的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 - 我也无法找到解决方案,因为这不会在控制台中打印下一个序列号
如果您知道解决方案,请指出正确的方向。
答案 0 :(得分:2)
自增强序列遇到唯一约束冲突的最常见情况是迁移数据时,导致数据的最大值超过序列值。
首先查询sequanence当前值:
SELECT seqname.CURRVAL FROM dual
然后修改序列值以确保序列的nextval超过数据的当前最大值。
ALTER SEQUENCE seqname INCREMENT BY XXXXXX;
SELECT seqname.NEXTVAL FROM dual;
答案 1 :(得分:0)
我找到了解决问题的方法。
问题来自数据库端。我们通过查看迁移文档和检查文件找到了。
@Edwin:感谢您的帮助,您的查询也帮助我找到了问题所在。
在进行迁移时,序列未从旧服务器复制到新服务器。当我们复制到新服务器时,一切正常。
谢谢大家。