【问题标题】:Spring data JPA with HSQLDB: user lacks privilege or object not found带有 HSQLDB 的 Spring Data JPA:用户缺少权限或找不到对象
【发布时间】:2019-04-02 18:34:06
【问题描述】:

我正在尝试使用可能包含带有 Spring Data JPA 的 cmets 的文章来设置一个简单的数据库。但是,一旦我启用文章 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

我的文章类如下所示:

@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>

当我删除与评论列表的关系时,它会起作用。有什么建议吗?

【问题讨论】:

  • 看起来像加入问题。如果您将 @JoinTable 注释添加到您的文章类私有 List cmets 中。是工作。您可以查看此示例codejava.net/frameworks/hibernate/…
  • 如何创建数据库架构?您需要将缺少的表添加到其中。
  • 添加 @JoinTable 注释也没有帮助,仍然是同样的错误。我让 Hibernate 生成表(spring.jpa.hibernate.ddl-auto=create-drop in application.properties)。

标签: java spring-boot spring-data-jpa hsqldb


【解决方案1】:

对我来说,问题在于我提供的依赖项。 我有一列 @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>

【讨论】:

  • 人们离真正发生的简单事情的理解如此遥远,真是太棒了。即使在像这样的原始情况下。太疯狂了……你是怎么做到离理解这么远的?
  • 不同的数据库
【解决方案2】:

您看到的异常只是一个WARNING,并不意味着有任何损坏。如果你使用show-sql: true选项,你会看到这个警告实际上是由alter table comment DROP CONSTRAINT XXXXX引起的,它是Hibernate创建DDL的一部分,并且执行这个查询时hsqldb没有任何表。

更改为ddl-auto: update 有其副作用。 import.sql 不适用于此选项。

为避免此警告,您可以将这些行添加到您的application.yaml

logging:
  level:
    org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl: ERROR

【讨论】:

    【解决方案3】:

    似乎spring.jpa.hibernate.ddl-auto 属性是问题所在。对于内存数据库,Spring 默认为create-drop。但是,在当前的 Spring Boot 或 HSQLDB 或 Hibernate 版本(或者可能是组合?)中,这似乎会导致问题。将值改为update后,就可以正常使用了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      相关资源
      最近更新 更多