H2:序列未发现异常,但存在于我的架构中
H2: Sequence not found Exception, but exists in my schema
我正在使用 Spring Boot、Hibernate/JPA 和 H2 来开发一些实体。
如果我在 H2 public 模式中创建 table/sequence,那么一切正常,我可以从我的应用程序 read/insert 进入数据库。
但是,如果我在我创建的模式中创建 table/sequence,我将无法插入,因为找不到序列。我可以在 H2 数据库中看到它并且它似乎在正确的模式中,我可以从中手动 select 但是当尝试在我的代码中插入时我得到:
Caused by: org.h2.jdbc.JdbcSQLException: Sequence "VENUE_SQ" not found; SQL statement:
call next value for VENUE_SQ [90036-191]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) ~[h2-1.4.191.jar:1.4.191]
at org.h2.message.DbException.get(DbException.java:179) ~[h2-1.4.191.jar:1.4.191]
at org.h2.message.DbException.get(DbException.java:155) ~[h2-1.4.191.jar:1.4.191]
at org.h2.command.Parser.readSequence(Parser.java:5399) ~[h2-1.4.191.jar:1.4.191]
at org.h2.command.Parser.readTerm(Parser.java:2806) ~[h2-1.4.191.jar:1.4.191]
etc...
一些 DDL:
create schema MY_SCHEMA AUTHORIZATION MY_SCHEMA_OWNER;
set schema MY_SCHEMA;
create sequence VENUE_SQ;
CREATE TABLE VENUE (
ID number not null,
NAME varchar2(255) not null, etc...
一些 DML:
INSERT INTO VENUE (ID, NAME, etc...
一些 JPA
@Entity
@Table(name = "VENUE", schema = "MY_SCHEMA")
@SequenceGenerator(name = "ID", sequenceName = "VENUE_SQ",
allocationSize = 1, schema = "MY_SCHEMA")
public class Venue {
@Id
@GeneratedValue(generator = "ID", strategy = GenerationType.SEQUENCE)
@Column(name = "ID", nullable = false)
private Long id;
@Column(name = "NAME")
private String name;
etc...
休眠 4.3.11
H2 1.4
Spring 引导 1.3.3.RELEASE
更新
我已经设法通过在@SequenceGenerator 注释中为序列名称添加模式前缀来实现这一点。我认为这不是必需的,因为我已经在该注释的参数中给出了架构!
@SequenceGenerator(name = "ID", sequenceName = "MY_SCHEMA.VENUE_SQ",
allocationSize = 1, schema = "MY_SCHEMA")
因此,我还没有解决这个问题,因为我想了解问题所在。
更新 2
请参阅下面我的回答,这与我们版本中的一个 Hibernate 错误有关。
更新后我发现这与休眠错误 HHH-7232 有关:
https://hibernate.atlassian.net/browse/HHH-7232
这似乎只影响 Hibernate 4.3 的某些版本,我们从 Spring Boot 中选择 4.3.11。
我正在使用 Spring Boot、Hibernate/JPA 和 H2 来开发一些实体。
如果我在 H2 public 模式中创建 table/sequence,那么一切正常,我可以从我的应用程序 read/insert 进入数据库。
但是,如果我在我创建的模式中创建 table/sequence,我将无法插入,因为找不到序列。我可以在 H2 数据库中看到它并且它似乎在正确的模式中,我可以从中手动 select 但是当尝试在我的代码中插入时我得到:
Caused by: org.h2.jdbc.JdbcSQLException: Sequence "VENUE_SQ" not found; SQL statement:
call next value for VENUE_SQ [90036-191]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) ~[h2-1.4.191.jar:1.4.191]
at org.h2.message.DbException.get(DbException.java:179) ~[h2-1.4.191.jar:1.4.191]
at org.h2.message.DbException.get(DbException.java:155) ~[h2-1.4.191.jar:1.4.191]
at org.h2.command.Parser.readSequence(Parser.java:5399) ~[h2-1.4.191.jar:1.4.191]
at org.h2.command.Parser.readTerm(Parser.java:2806) ~[h2-1.4.191.jar:1.4.191]
etc...
一些 DDL:
create schema MY_SCHEMA AUTHORIZATION MY_SCHEMA_OWNER;
set schema MY_SCHEMA;
create sequence VENUE_SQ;
CREATE TABLE VENUE (
ID number not null,
NAME varchar2(255) not null, etc...
一些 DML:
INSERT INTO VENUE (ID, NAME, etc...
一些 JPA
@Entity
@Table(name = "VENUE", schema = "MY_SCHEMA")
@SequenceGenerator(name = "ID", sequenceName = "VENUE_SQ",
allocationSize = 1, schema = "MY_SCHEMA")
public class Venue {
@Id
@GeneratedValue(generator = "ID", strategy = GenerationType.SEQUENCE)
@Column(name = "ID", nullable = false)
private Long id;
@Column(name = "NAME")
private String name;
etc...
休眠 4.3.11
H2 1.4
Spring 引导 1.3.3.RELEASE
更新
我已经设法通过在@SequenceGenerator 注释中为序列名称添加模式前缀来实现这一点。我认为这不是必需的,因为我已经在该注释的参数中给出了架构!
@SequenceGenerator(name = "ID", sequenceName = "MY_SCHEMA.VENUE_SQ",
allocationSize = 1, schema = "MY_SCHEMA")
因此,我还没有解决这个问题,因为我想了解问题所在。
更新 2
请参阅下面我的回答,这与我们版本中的一个 Hibernate 错误有关。
更新后我发现这与休眠错误 HHH-7232 有关:
https://hibernate.atlassian.net/browse/HHH-7232
这似乎只影响 Hibernate 4.3 的某些版本,我们从 Spring Boot 中选择 4.3.11。