JPA данных Spring с HSQLDB: пользователю не хватает прав или объект не найден - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь настроить простую базу данных со статьей, которая может содержать комментарии с помощью 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

Мой класс статьи выглядит следующим образом:

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

Когда я удаляю отношение к списку комментариев, оно работает. Есть предложения?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Исключение, которое вы видели, это просто ПРЕДУПРЕЖДЕНИЕ , и оно действительно не означает ничего сломанного. Если вы используете опции show-sql: true, вы увидите, что это предупреждение на самом деле вызвано alter table comment DROP CONSTRAINT XXXXX, который является частью DDL создания Hibernate, и hsqldb не имеет таблицы при выполнении этого запроса.

Изменение на ddl-auto: update имеет свой побочный эффект. import.sql не будет работать с этой опцией.

Чтобы избежать этого ПРЕДУПРЕЖДЕНИЕ , вы можете добавить эти строки в ваш application.yaml:

logging:
  level:
    org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl: ERROR
0 голосов
/ 31 октября 2018

Кажется, проблема была в свойстве spring.jpa.hibernate.ddl-auto. По умолчанию Spring имеет значение create-drop для баз данных в памяти. Однако в текущей версии Spring Boot, HSQLDB или Hibernate (или, возможно, комбинации?) Это, кажется, вызывает проблемы. После изменения значения на update оно просто отлично работает.

...