@SequenceGenerator allocationSize'重复键错误'问题

时间:2015-06-22 13:37:21

标签: java database hibernate postgresql orm

我的SequenceGenerator的allocationSize为5(与hibernate.id.new_generator_mappings = true一起)。所以根据我的理解,hibernate应该尝试将这些值作为新的id返回:

    • a)从数据库序列中获取下一个值(例如id = 70)
    • b)减去allocationSize(70-5 = 65)
    • c)返回65 + 1 = 66作为新id。
  1. 返回67作为新ID。

  2. return 68
  3. return 69
  4. return 70
  5. 最新序列值命中,请继续执行1a)
  6. 所以id应该在66到70之间。我的问题是生成的id是65到69.如果我从数据库中调用next_value(postgres)并且序列返回65,我得到一个重复的键hibernate之后也会产生65错误(从序列中获得70之后)。

    有关此主题的任何线索或帮助?

    €:抱歉,忘记发布我的代码:

    发电机:

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = GENERATOR_NAME)
    @SequenceGenerator(sequenceName = "hibernate_sequence", name = GENERATOR_NAME, allocationSize = 5)
    private Integer id;
    

    序列(Postgresql):

    CREATE SEQUENCE hibernate_sequence
      INCREMENT 5
      MINVALUE 1
      MAXVALUE 9223372036854775807
      START 10041865
      CACHE 1;
    

2 个答案:

答案 0 :(得分:1)

您需要使用pooled-lo optimizer,因为它可以与其他系统互操作,或者从管理控制台发出插入:

@Id
@GenericGenerator(name = "sequenceGenerator", strategy = "enhanced-sequence",
    parameters = {
        @org.hibernate.annotations.Parameter(
            name = "optimizer", 
            value = "pooled"),
        @org.hibernate.annotations.Parameter(
            name = "initial_value", 
            value = "1"),
        @org.hibernate.annotations.Parameter(
            name = "increment_size", 
            value = "5")
    }
)
@GeneratedValue(
    strategy = GenerationType.SEQUENCE, 
    generator = "sequenceGenerator")
private Long id;

答案 1 :(得分:-1)

更改 hbm2ddl.auto 配置,将其设置为create然后它将起作用,因为用于在表中分配id的序列值取决于先前存储的序列号,而不是错误。

<property name="hbm2ddl.auto">create</property>