Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate抛出PK冲突错误_Java_Oracle_Hibernate_Jpa_Jboss7.x - Fatal编程技术网

Java Hibernate抛出PK冲突错误

Java Hibernate抛出PK冲突错误,java,oracle,hibernate,jpa,jboss7.x,Java,Oracle,Hibernate,Jpa,Jboss7.x,我一直在jboss 4.2.3中使用hibernate,一切正常,现在我将代码迁移到jboss 7.1.1,突然我开始得到: Caused by: org.hibernate.exception.ConstraintViolationException: ORA-00001: unique constraint (OBLICORE.PK_ACE_WORKERS_QUEUE_STATS_ID) violated 生成的ID也是负数 失败的实体被定义为: @Id @SequenceGenerato

我一直在jboss 4.2.3中使用hibernate,一切正常,现在我将代码迁移到jboss 7.1.1,突然我开始得到:

Caused by: org.hibernate.exception.ConstraintViolationException: ORA-00001: unique constraint (OBLICORE.PK_ACE_WORKERS_QUEUE_STATS_ID) violated
生成的ID也是负数

失败的实体被定义为:

@Id
@SequenceGenerator(name = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", sequenceName = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", allocationSize = 500)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ACE_WORKERS_QUEUE_STATS_ID")
@Column(name = "ID")
private long Id;
我在Oracle中检查了这个序列,看起来还可以(就像我说的,它以前在JBoss4.2中工作过,自迁移以来DB端没有任何变化)


我尝试编写Hibernate查询日志,但找不到该查询,我还记录了持久化该类的特定调用,并发现它只被调用一次。

如果生成的id值在项目中不是那么重要,请尝试使用
@GeneratedValue(strategy=GenerationType.AUTO)
此策略将自动生成id,方法是将last递增1。希望它对您有用。

检查此问题:

它必须是Hibernate的序列生成器,默认为Hi/Lo算法,返回的值溢出。您可以尝试使用特定于hibernate的注释来默认为较旧的行为
GenericGenerator(name=“blah”,strategy=“sequence”)
,或设置
allocationSize=1


如果您依赖于序列的增量大于1,则必须使用不同的生成器。或者,将
hibernate.id.new_generator_mappings
设置为
false
就足够了,但这属于一个新问题的范围。

当我们将hibernate更改为使用新的生成器时,我使用了以下脚本来修复序列:

  DECLARE
    v NUMBER;
  BEGIN
    FOR r IN (select sequence_name from user_sequences) LOOP
      EXECUTE IMMEDIATE 'ALTER SEQUENCE '|| r.sequence_name ||' INCREMENT BY 50';
      EXECUTE IMMEDIATE 'SELECT '|| r.sequence_name ||' .NEXTVAL FROM DUAL' INTO v;
    END LOOP;
  END;
  /

如果您的分配规模为500,您应该将“增量50”更改为“增量500”。

我有一个非常大的项目,其中有许多使用序列的文件,并且该产品已经部署在许多客户站点(这是版本8),因此我不能随意进行更改,我必须坚持现有的。非常感谢您,我在这上面撞了很久。allocationSize=1对我不起作用,但strategy=“sequence”就像一个符咒