Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 使用带有H2的序列会导致无法定位要检索的行_Spring_Postgresql_Hibernate_Jpa_Spring Boot - Fatal编程技术网

Spring 使用带有H2的序列会导致无法定位要检索的行

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

我们的产品数据库是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);
实体的列定义为:

@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
的所有操作。所以我不确定这是否会带来不同。