Spring 带有 HSQLDB 的数据 JPA:用户缺少权限或找不到对象
Spring data JPA with HSQLDB: user lacks privilege or object not found
我正在尝试使用一篇文章设置一个简单的数据库,其中可能包含 Spring Data JPA 的评论。但是,一旦我启用文章 Hibernate 的评论关系就会抛出异常:
o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDL via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
[...]
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: PUBLIC.ARTICLE_COMMENTS
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) ~[hsqldb-2.4.1.jar:2.4.1]
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) ~[hsqldb-2.4.1.jar:2.4.1]
at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source) ~[hsqldb-2.4.1.jar:2.4.1]
at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source) ~[hsqldb-2.4.1.jar:2.4.1]
at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95) ~[HikariCP-2.7.9.jar:na]
at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-2.7.9.jar:na]
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
... 157 common frames omitted
我的文章class如下所示:
@Entity
public class Article {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private String abstractText;
private String author;
private Date createdAt;
private int visibility;
private int likes;
private int views;
private int commentCount;
@OneToMany(cascade=CascadeType.ALL)
private List<Comment> comments;
// getters and setters omitted
}
以及评论:
@Entity
public class Comment {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String commentText;
private Date createdAt;
}
并且 pom 包含对 HSQLDB、PostgreSQL、Spring Boot Starter Data JPA 和 Spring Boot Starter Web 的依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
当我删除与评论列表的关系时,它起作用了。有什么建议吗?
似乎 spring.jpa.hibernate.ddl-auto
属性 是问题所在。对于内存数据库,Spring 默认为 create-drop
。但是,在当前的 Spring Boot 或 HSQLDB 或 Hibernate 版本(或者可能是组合?)中,这似乎会导致问题。改成update
后就正常了
您看到的异常只是一个 WARNING,它并不意味着有任何损坏。如果你使用 show-sql: true
选项,你会看到这个警告实际上是由 alter table comment DROP CONSTRAINT XXXXX
引起的,它是 Hibernate 创建 DDL 的一部分,而执行此查询时 hsqldb 没有任何 table。
更改为 ddl-auto: update
有其副作用。 import.sql
不适用于此选项。
为避免此 警告,您可以将这些行添加到您的 application.yaml
:
logging:
level:
org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl: ERROR
我的问题是我提供的依赖项。
我有一列 @Column(nullable = false, columnDefinition = "text")
,旧的依赖项不支持此列定义。这就是为什么我必须改变
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>test</scope>
</dependency>
至此
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
我正在尝试使用一篇文章设置一个简单的数据库,其中可能包含 Spring Data JPA 的评论。但是,一旦我启用文章 Hibernate 的评论关系就会抛出异常:
o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDL via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
[...]
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: PUBLIC.ARTICLE_COMMENTS
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) ~[hsqldb-2.4.1.jar:2.4.1]
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) ~[hsqldb-2.4.1.jar:2.4.1]
at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source) ~[hsqldb-2.4.1.jar:2.4.1]
at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source) ~[hsqldb-2.4.1.jar:2.4.1]
at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95) ~[HikariCP-2.7.9.jar:na]
at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-2.7.9.jar:na]
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
... 157 common frames omitted
我的文章class如下所示:
@Entity
public class Article {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private String abstractText;
private String author;
private Date createdAt;
private int visibility;
private int likes;
private int views;
private int commentCount;
@OneToMany(cascade=CascadeType.ALL)
private List<Comment> comments;
// getters and setters omitted
}
以及评论:
@Entity
public class Comment {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String commentText;
private Date createdAt;
}
并且 pom 包含对 HSQLDB、PostgreSQL、Spring Boot Starter Data JPA 和 Spring Boot Starter Web 的依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
当我删除与评论列表的关系时,它起作用了。有什么建议吗?
似乎 spring.jpa.hibernate.ddl-auto
属性 是问题所在。对于内存数据库,Spring 默认为 create-drop
。但是,在当前的 Spring Boot 或 HSQLDB 或 Hibernate 版本(或者可能是组合?)中,这似乎会导致问题。改成update
后就正常了
您看到的异常只是一个 WARNING,它并不意味着有任何损坏。如果你使用 show-sql: true
选项,你会看到这个警告实际上是由 alter table comment DROP CONSTRAINT XXXXX
引起的,它是 Hibernate 创建 DDL 的一部分,而执行此查询时 hsqldb 没有任何 table。
更改为 ddl-auto: update
有其副作用。 import.sql
不适用于此选项。
为避免此 警告,您可以将这些行添加到您的 application.yaml
:
logging:
level:
org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl: ERROR
我的问题是我提供的依赖项。
我有一列 @Column(nullable = false, columnDefinition = "text")
,旧的依赖项不支持此列定义。这就是为什么我必须改变
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>test</scope>
</dependency>
至此
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>