2015-12-02 96 views
3

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

请让我知道任何帮助。

这里是我的实体和程序:

实体:

@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; 

回答

0

您定义不符合1000开始,但该序列以1(MINVALUE 1) 。我也没有看到你将所提到的序列设置为你的实体使用的序列。

+0

它的一个发布错误。更新与实际 – Sydubabu

+0

@Steve Ebersole任何帮助。 – Sydubabu

5

休眠呼叫SEQ_name.nextval但如果allocationSize大于1,它由allocationSize递减它和由1

下(allocationSize-1)密钥生成递增它而不通信完成与数据库通过简单1。

增加其结果是,如果你使用默认allocationSize是50,有两种后果:

序列必须有INCREMENT BY设置为相同的值allocationSize

要对齐与数据库中已有的键的顺序,设置START WITH

最大值(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 
+0

我不认为序列高速缓存的问题,因为在我的情况下,在数据库级别的高速缓存只有20但我得到951而不是1000.如果它是20不同,我怀疑缓存的问题。但这里的差异是50这是一个默认** allocationSize **值 – Sydubabu

+0

@Sydubabu我明白了 - [this](http://stackoverflow.com/questions/5346147/hibernate-oracle-sequence-produces-large-gap )可能会对你有趣... –