Hibernate在Oracle中使用序列生成器和序列

时间:2011-11-30 15:04:04

标签: java oracle hibernate jpa

我有以下顺序:

[现在在Toad中看到]:

CREATE SEQUENCE LOG_ID_SEQ
  START WITH 787585
  MAXVALUE 1000000000000000000000000000
  MINVALUE 1
  NOCYCLE
  NOCACHE
  NOORDER
/

我有以下表序列生成器:

@SequenceGenerator(name="LOG_ID_SEQ", sequenceName="LOG_ID_SEQ")
@Id
@Column(name = "log_id", nullable = false)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="LOG_ID_SEQ")
Long id;

log_id的最高值目前为39379151

现在奇怪的问题:客户端创建了poduction数据库的转储 并将其导入测试数据库。 当我测试应用程序时,我在此表上遇到ORA-00001唯一约束错误。

当我导入相同的转储并在​​我的机器上测试应用程序时,我没有收到该错误吗?

Hibernate如何实现这一目标?我不知道在哪里或者在寻找什么。

[增订]: 准确一点:在我将转储本地导入到新模式后,转储中的最后一个序列值是39354002.如果没有重置序列,我的下一个值是39379151。

2 个答案:

答案 0 :(得分:0)

您从序列中获取的值与表格中的数据发生冲突。

max(log_id)= 39,379,151,高于你的序列“start with”value = 787,585。

使用高于max(log_id)的“start with”重新创建序列,你应该全部设置。

错误可能不一致,因为您可能没有使用每个序列值,因此如果您获得的值落在现有行之间的间隙,有时可能会成功插入。

答案 1 :(得分:0)

如果log_id的当前最高值为39379151,但您在新架构/数据库中重新创建LOG_ID_SEQ且起始值为787585,则插入的下一个新行将具有已存在的log_id值。您可能应该更改CREATE SEQUENCE语句,以反映log_id更新的新最大值。