我们有一个使用序列生成器的实体 Credentials:
@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。
有任何想法吗?这是错误的世代类型吗?