【问题标题】:Hibernate throws PK violation errorHibernate 抛出 PK 违例错误
【发布时间】:2012-04-10 21:13:02
【问题描述】:

我一直在 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 中的序列,似乎没问题(就像我说的,它以前在 jboss 4.2 上工作过,自迁移以来数据库端没有任何变化)。

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

【问题讨论】:

    标签: java oracle hibernate jpa jboss7.x


    【解决方案1】:

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

    【讨论】:

    • 我有一个非常大的项目,其中包含许多使用序列的文件,并且该产品已经部署在许多客户站点(这是第 8 版),所以我不能随意进行更改,我必须坚持我所拥有的。
    【解决方案2】:

    检查这个问题:hibernate oracle sequence produces large gap

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

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

    【讨论】:

    • 非常感谢,我为此纠结了很久。
    • allocationSize=1 对我不起作用,但 strategy="sequence" 就像一个魅力
    【解决方案3】:

    当我们更改 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”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      相关资源
      最近更新 更多