为啥 Hibernate 不使用序列表中的下一个序列值?

Posted

技术标签:

【中文标题】为啥 Hibernate 不使用序列表中的下一个序列值?【英文标题】:Why is Hibernate not using the next sequence value in the sequence table?为什么 Hibernate 不使用序列表中的下一个序列值? 【发布时间】:2013-06-27 21:06:49 【问题描述】:

我们有一个使用序列生成器的实体凭据:

@Entity
@Table(name = "CREDENTIALS")
@SequenceGenerator(name = "CredentialsSequenceGenerator", sequenceName = "CREDENTIALS_SEQUENCE")
public class Credentials extends AbstractTraceable implements Serializable 

    ...

    @Id
    @Column(name = "ID", unique=true)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CredentialsSequenceGenerator")
    public Long getId() 
        return id;
    

我们遇到的问题是在我们的测试中。我们使用 EmbeddedDatabaseBuilder.addScript("...") 将一些数据加载到数据库中,然后在测试中我们尝试创建一些对象。第一次插入失败,因为主键已经被使用:

15:54:02.777 [main] DEBUG org.hibernate.id.SequenceGenerator - Sequence identifier
generated: BasicHolder[java.lang.Long[0]]
15:54:02.779 [main] DEBUG o.h.e.i.AbstractSaveEventListener - Generated identifier:
1, using strategy: org.hibernate.id.SequenceHiLoGenerator

我的理解是 GenerationType 的 SequenceGenerator。SEQUENCE 使用了一个名为“hibernate_sequences”的序列表,结构如下(这是由 SchemaExport 生成的):

  create table hibernate_sequences (
     sequence_name varchar(255),
     sequence_next_hi_value integer 
  );

在我们的脚本中,我们递增序列表:

insert into hibernate_sequences VALUES('CREDENTIALS_SEQUENCE', 13);

Hibernate 似乎根本没有使用这个表,因为它尝试使用的第一个 id 是 1。

有什么想法吗?这是错误的世​​代类型吗?

【问题讨论】:

序列生成器使用序列,而不是表。打开 SQL 日志,你就会知道 Hibernate 执行了哪些查询 知道了。我不知道为什么 Hibernate SchemaExport 会生成“hibernate_sequences”。这让我很困惑。它根本没有被使用。正如你所说,正在使用 CREDENTIALS_SEQUENCE。 【参考方案1】:

我发现我的脚本需要更新序列表 CREDENTIALS_SEQUENCE。在 HSQL 中执行如下:

alter sequence credentials_sequence restart with 13;

未使用 HIBERNATE_SEQUENCES。

【讨论】:

你能告诉我你是在哪里做的吗?

以上是关于为啥 Hibernate 不使用序列表中的下一个序列值?的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的下一个节点

hibernate的merge()

Hibernate 获取带有字符串前缀的下一个 ID

已知先序后序构造二叉树

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。

linq ,语句是 query = query.OrderByDescending(NewsTj => NewsTj.Id); 为啥不按倒序进行排序呢?