Hibernate generates negative id values when using a sequence

前端 未结 3 797
粉色の甜心
粉色の甜心 2020-11-29 23:00

I have a class with the following definition:

@Id
@SequenceGenerator(name = \"SEQ_ACE_WORKERS_QUEUE_STATS_ID\", sequenceName = \"SEQ_ACE_WORKERS_QUEUE_STATS_         


        
相关标签:
3条回答
  • 2020-11-29 23:35

    I just ran into this issue when migrating from JBoss 6.1 to JBoss 7.1.

    According to the JBoss AS 7.1 JPA documentation ( https://docs.jboss.org/author/display/AS71/JPA+Reference+Guide#JPAReferenceGuide-Persistenceunitproperties),

    JBoss 7.1 automatically sets several hibernate properties. One of the properties being set is hibernate.id.new_generator_mappings which activates new ID generators that use different algorithms and are not backwards compatible. Setting this property to false in your persistence.xml file will restore the old ID generator behavior.

    The hibernate 4 documentation also has information regarding the new ID generators: http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html_single/#mapping-declaration-id-generator.

    The hibernate documentation clearly states that the new ID generators are not enabled by default, but, as noted above, JBoss 7.1 is automatically enabling them.

    0 讨论(0)
  • 2020-11-29 23:37

    Setting hibernate.id.new_generator_mappings to false in my persistence.xml was just the first part of the solution to my problem:

    To completely solve the problem I added the allocationSize to 1 in the @SequenceGenerator (which I was omitting).

    0 讨论(0)
  • 2020-11-29 23:42

    The new behaviour is the followings:

    AllocationSize is a range of primary key values reserved for Hibernate. And the select seq.nextval from dual will be done only after hibernate consumed this range of primary keys.

    So you must declare the same value on both allocationSize (Hibernate) and sequence increment by (DB)

    When explicitly set allocationSize=500, e.g. on Oracle

    create sequence SEQ_ACE_WORKERS_QUEUE_STATS_ID
           MINVALUE 1 
           MAXVALUE 999999999999999999999999999 
           START WITH 1
           INCREMENT BY 500 
           NOCACHE 
           NOCYCLE;
    

    Otherwise, you'll notice negative values or constraint errors raised from your DB because of primary key collisions.

    When the app server is restarted, you'll notice the 'jump' between the latest primary key allocated, and the 'newly' sequence number selected at restart.

    Final comment: default value is 50. So if you don't specify allocationSize on the Hibernate side, you must declare increment by 50 on the DB side.

    0 讨论(0)
提交回复
热议问题