Spring 使用带有H2的序列会导致无法定位要检索的行
我们的产品数据库是Postgres。对于表,我们使用一个序列为一个非id列生成数据。此序列的定义与此类似,并从Flyway迁移执行:Spring 使用带有H2的序列会导致无法定位要检索的行,spring,postgresql,hibernate,jpa,spring-boot,Spring,Postgresql,Hibernate,Jpa,Spring Boot,我们的产品数据库是Postgres。对于表,我们使用一个序列为一个非id列生成数据。此序列的定义与此类似,并从Flyway迁移执行: create sequence check_number_seq minvalue 1000 maxvalue 9999 cycle; alter table guest_check alter column check_number set default nextval('check_number_seq'::regclass); 实体的列定义为: @Gen
create sequence check_number_seq minvalue 1000 maxvalue 9999 cycle;
alter table guest_check alter column check_number set default nextval('check_number_seq'::regclass);
实体的列定义为:
@Generated(GenerationTime.INSERT)
@Column(nullable = false, insertable=false, updatable=false)
private Integer checkNumber;
当与博士后赛跑时,这一切都非常有效。不幸的是,它在运行H2时不起作用,H2是我们用于测试的。我添加了一个@Sql
脚本来运行测试,并对序列创建进行了轻微修改,以使用H2:
create sequence IF NOT EXISTS check_number_seq minvalue 1000 maxvalue 9999 cycle;
alter table guest_check alter column check_number set default nextval('check_number_seq');
但是,当测试针对表运行时,它们都会失败,并出现相同的错误:
org.springframework.orm.jpa.JpaSystemException: Unable to locate row for retrieval of generated properties: [com.foo.entity.thing.GuestCheck#1000];
我尝试将H2模式和方言更改为Postgres,但这并没有解决问题。我们正在使用Spring Boot 1.5.1
目前的解决办法是,我们正在对Postgres DB运行测试,但为了便于使用,我真的想回到H2。我构建了一个最小测试,用于对非id列()使用序列 然而,我无法重现它的问题 这是我的刀:
@Entity
@Table(name = "guest_check")
public class GuestCheck {
@Id
@Column(nullable = false)
private String id;
@Generated(GenerationTime.INSERT)
@Column(nullable = false, insertable = false, updatable = false, name = "check_number")
private Integer checkNumber;
public Integer getCheckNumber() {
return checkNumber;
}
public void setCheckNumber(Integer checkNumber) {
this.checkNumber = checkNumber;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "guestCheck, id: " + id + ", checkNo.:" + checkNumber;
}
}
这是我的测试:
@Test
public void test() {
for (int i = 0; i < 10; i++) {
GuestCheck guestCheck = new GuestCheck();
guestCheck.setId("id " + i);
guestCheckRepository.save(guestCheck);
}
List<GuestCheck> guestChecks = guestCheckRepository.findAll();
for (GuestCheck guestCheck : guestChecks) {
System.out.println("guestCheck: " + guestCheck);
}
}
也许我误解了什么?我构造了一个最小测试,用于对非id列()使用序列 然而,我无法重现它的问题 这是我的刀:
@Entity
@Table(name = "guest_check")
public class GuestCheck {
@Id
@Column(nullable = false)
private String id;
@Generated(GenerationTime.INSERT)
@Column(nullable = false, insertable = false, updatable = false, name = "check_number")
private Integer checkNumber;
public Integer getCheckNumber() {
return checkNumber;
}
public void setCheckNumber(Integer checkNumber) {
this.checkNumber = checkNumber;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "guestCheck, id: " + id + ", checkNo.:" + checkNumber;
}
}
这是我的测试:
@Test
public void test() {
for (int i = 0; i < 10; i++) {
GuestCheck guestCheck = new GuestCheck();
guestCheck.setId("id " + i);
guestCheckRepository.save(guestCheck);
}
List<GuestCheck> guestChecks = guestCheckRepository.findAll();
for (GuestCheck guestCheck : guestChecks) {
System.out.println("guestCheck: " + guestCheck);
}
}
可能我误解了什么?什么是H2连接字符串?您是否设置了类似于
jdbc:h2:mem:play;模式=PostgreSQL;LOCK_MODE=0
?注意说出生成了什么(GenerationTime.INSERT),因为它不是JPA。调试将引导您在SQL上查看JPA提供程序日志issued@StanislavL是的,这正是我设置的。@NeilStockton它是一个HibernateAPIannotation@Gregg,与相同的问题斗争:H2和值,由序列生成。你找到解决方法了吗?什么是H2连接字符串?您是否设置了类似于jdbc:h2:mem:play;模式=PostgreSQL;LOCK_MODE=0
?注意说出生成了什么(GenerationTime.INSERT),因为它不是JPA。调试将引导您在SQL上查看JPA提供程序日志issued@StanislavL是的,这正是我设置的。@NeilStockton它是一个HibernateAPIannotation@Gregg,与相同的问题斗争:H2和值,由序列生成。你找到解决办法了吗?谢谢。唯一真正的区别是您的DAOConfigH2
。我将所有这些连接到一个属性文件中,我有一个主应用程序类,它具有@SpringBootApplication
,它可以根据每个注释执行DAOConfigH2
的所有操作。所以我不确定这是否会带来不同。谢谢。唯一真正的区别是您的DAOConfigH2
。我将所有这些连接到一个属性文件中,我有一个主应用程序类,它具有@SpringBootApplication
,它可以根据每个注释执行DAOConfigH2
的所有操作。所以我不确定这是否会带来不同。