Hibernate抛出PK违规错误

时间:2012-03-27 10:32:38

标签: 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
@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中的序列,它似乎是O.K(就像我说的,它之前使用的是jboss 4.2,并且自迁移以来在数据库方面没有任何变化)。

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

3 个答案:

答案 0 :(得分:8)

请检查此问题:hibernate oracle sequence produces large gap

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

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

答案 1 :(得分:1)

当我们更改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;
  /

如果您的allocationSize为500,则应将“INCREMENT BY 50”更改为“INCREMENT BY 500”。

答案 2 :(得分:0)

如果生成的id值在您的项目中不那么重要,请尝试使用@GeneratedValue(strategy = GenerationType.AUTO) 此策略将通过最后一个递增来自动生成id。希望它对你有用。