5

我正在从 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;
4

3 回答 3

9

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

下一个 (allocationSize-1) 密钥生成是在不与数据库通信的情况下完成的,简单地增加 1。

因此,如果您使用默认值allocationSize50,则会产生两个后果:

该序列INCREMENT BY的值必须与 allocationSize

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

最大值(ID)+ 分配大小

这里是一个小例子

-- 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 作为推荐

于 2015-12-02T15:54:34.513 回答
0

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

于 2015-12-02T14:41:12.340 回答
0

在某些情况下,您的 Oracle 用户将能够从另一个 SEQUENCE 可能不正确的用户中选择一个 SEQUENCE。因此,您应该与您的 Oracle 用户核实:</p>

select * from all_sequences t where t.SEQUENCE_NAME = 'HIB_SEQ';
于 2021-03-15T09:31:06.760 回答