【问题标题】:allocationSize and duplicated pk issueallocationSize 和重复的 pk 问题
【发布时间】:2016-02-16 22:45:44
【问题描述】:

Jboss 7.2.0、ejb3、oracle 项目中的所有实体都定义了序列生成器,例如 @SequenceGenerator(name="xx", sequenceName="yy" allocationSize="10")

对于一对多关系,有时我会遇到重复主键的问题。不知道这里出了什么问题,但是在事务回滚后,序列被重置,并且我一直都有违反约束的错误 我已将 allocationSize 更改为 1,似乎没问题,但原因是什么?

【问题讨论】:

  • 在 Oracle 数据库中,SEQUENCE 永远不会被回滚重置。一旦从 SEQUENCE 中取出数字,它们就会被取出,如果事务回滚,这些数字就会丢失。另一方面,从 SEQUENCE 派生的数字不应该附加任何意义——它们只是数字。如果 JBoss 正在做某事来“重置”一个序列,那绝对是在做错事。祝你好运。
  • 我想我找到了原因,因为这次产生了负数。根据stackoverflow,在我的情况下,创建oracle序列参数增量必须设置为值10

标签: oracle ejb jboss7.x


【解决方案1】:

查看讨论:https://developer.jboss.org/thread/104030?start=15&tstart=0

在您的问题中不清楚 sequenceName 是 hibernate_sequence 还是 oracle 序列?如果是 oracle - 你不应该有重复

@Id(generate = GeneratorType.SEQUENCE, generator = "mysequence")
@SequenceGenerator(name = "mysequence", sequenceName = "MY_SEQ",allocationSize=1)
//@SequenceGenerator(name = "mysequence", sequenceName = "hibernate_sequence")
@Column(name = "COVT_ID", primaryKey=true)
public long getId() {
return m_id;
}

【讨论】:

    【解决方案2】:

    您可能在persistence.xml 中使用了值为“drop-create-tables”属性的ddl-generation 属性。这会导致所有序列和表被删除并再次使用初始值重新创建,因此相同的序列值被重用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2012-09-26
      相关资源
      最近更新 更多