Hibernate 5序列生成问题

5

我正在从Hibernate 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个回答

9
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

注意,这种行为需要将属性 hibernate.id.new_generator_mappings 设置为 true,如推荐的那样。


我认为序列缓存不是问题,因为在我的情况下,数据库级别的缓存仅为20,但我得到了951而不是1000。如果它是20个不同的话,我怀疑缓存的问题。但这里的差异是50,这是默认的allocationSize值。 - Sydubabu
1
@Sydubabu 我明白了 - 这个链接 对你可能会很有帮助... - Marmite Bomber

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

这是一个发布错误。已更新为实际内容。 - Sydubabu
@Steve Ebersole 请帮忙。 - Sydubabu

0
在某些情况下,你的Oracle用户可能会从另一个用户那里选择一个不正确的序列。因此,你应该与你的Oracle用户核实一下:
select * from all_sequences t where t.SEQUENCE_NAME = 'HIB_SEQ';

请您从回答中删除非英文字符 - 请参阅 https://meta.stackexchange.com/questions/13676/do-posts-have-to-be-in-english-on-stack-exchange 了解有关在答案中使用英语的信息。 - Toby Beresford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接