Hibernate 5序列生成问题

时间:2015-12-02 14:13:52

标签: oracle jpa hibernate-5.x

我从3迁移到hibernate 5.我看到序列生成器在Hibernate 5中无法正常工作。我的序列定义为最小值1000并且递增1.但是当我尝试创建新的实体记录时,我看到一个用id 951插入的记录。似乎id是从实际序列下一个值的50。在我的情况下,ID应该是1000。

请让我知道任何帮助。

这是我的实体和序列:

实体:

@Entity
@Table(name = "SOME TABLE")
public class Group {

  @Id
  @Column(name = "id")
  @SequenceGenerator(name = "name",  sequenceName ="SEQ_name" )
  @GeneratedValue(strategy = GenerationType.AUTO, generator="name")
  private Long id;

  @Pattern(regexp = "^[^\\*]*$", message = "{3011}")
  @Size(message = "{3014}")
  @NotBlank(message = "{3000}")
  @Column(name = NAME, unique = true, nullable = false)
  private String name;

序列:

CREATE SEQUENCE  SEQ_name MINVALUE 1000 NOMAXVALUE INCREMENT BY 1 CACHE 20 NOORDER NOCYCLE;

3 个答案:

答案 0 :(得分:7)

Hibernate调用SEQ_name.nextval但是如果allocationSize大于1,它会通过allocationSize递减它并将其递增1。

下一个(allocationSize-1)密钥生成在没有与数据库通信的情况下完成,增加1。

因此,如果您使用默认的allocationSize为50,则会产生两种后果:

序列必须将INCREMENT BY设置为与allocationSize

相同的值

要将序列与数据库中的现有键对齐,请将START WITH设置为

max(ID) + allocationSize

这是一个小例子

-- START WITH = max(ID) + allocation size 
-- INCREMENT BY = allocation size
-- e.g. if 100 is the last key,
-- to start with a key 101 - set START WITH to 150
CREATE SEQUENCE hib_seq START WITH 150 INCREMENT BY 50;



select hib_seq.nextval - 50 + 1 from dual;
101
-- 49 times Hibernate performs increase by 1 - keys 102 to 150
-- new sequence generation
select hib_seq.nextval - 50 + 1 from dual;
151

答案 1 :(得分:0)

您定义的序列不是以1000开头,而是以1(最小值1)开头。我也没有看到您将提到的序列设置为实体使用的序列的位置。

答案 2 :(得分:-1)

在某些情况下,您的 Oracle 用户将能够从其他用户的 SEQUENCE 可能不正确的用户那里选择一个 SEQUENCE。因此,您应该与您的 Oracle 用户核对:

select * from all_sequences t where t.SEQUENCE_NAME = 'HIB_SEQ';