Junit HSQLDB - пользователю не хватает привилегии или объект не найден - THIS_.oh-ordnbr

Я получаю исключение, когда имя моего столбца содержит дефис "-"

    Entity : this is the entity name.
    @Entity
    @Table(name = "RequestHeader")
    public class RequestHeader implements Serializable { 
    ....
    ....    
    @Column(name = "`oh-ordnbr`")
    private Integer ohOrdnbr;

Определение схемы: это запрос для создания схемы.

    CREATE MEMORY TABLE PUB.REQUESTHEADER(
           REQUESTID INTEGER,
           IMUSERID INTEGER,
           REQUESTDATE DATE,
           REQUESTTIME INTEGER,
           REQUESTSTATUS VARCHAR(19),
           REQUESTTYPE VARCHAR(22),
           HEADERINSTRUCTIONS VARCHAR(5150),
           DATEFORMAT VARCHAR(20),
           TIMEFORMAT VARCHAR(20),
           LANGUAGEID INTEGER,
           "OH-ORDNBR" INTEGER,
           "OH-TRCNSTAMP" INTEGER,
           ISPICKUPLIST BIT(1),
           CONSTRAINT "RQH-1" PRIMARY KEY(REQUESTID)
     );

Ошибка ниже:

Exception Stack: Error message which I have received by running the Junit.
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: THIS_.oh-ordnbr
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.ExpressionColumn.checkColumnsResolved(Unknown Source)
at org.hsqldb.QueryExpression.resolve(Unknown Source)
at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
at org.hsqldb.ParserCommand.compilePart(Unknown Source)
at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
at org.hsqldb.Session.compileStatement(Unknown Source)
at org.hsqldb.StatementManager.compile(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)

Может ли кто-нибудь помочь мне исправить это?

3 ответа

Причиной ошибки объекта not found является тот факт, что столбец oh-ordnbr определен с учетом регистра (это происходит из-за двойных кавычек, которые вы помещаете вокруг него).

У вас есть два возможных решения:

  1. Не используйте тире (дефисы) в вашем SQL. В любом случае, это плохая практика, вместо этого используйте подчеркивание.
  2. Обновите аннотацию JPA следующим образом:

      @Column(name = "`OH-ORDNBR`")
      private Integer ohOrdnbr;
    

Я настоятельно рекомендую использовать подчеркивания вместо черточек, вы никогда не знаете, какие странности могут иметь различные реализации JPA при использовании второго решения.

Убедитесь, что в вашем конфигурационном файле указан правильный поставщик, я исправил ту же проблему, предоставив поставщика org.hibernate.ejb.HibernatePersistence.

Если сценарии HSQL выполняются через Java и если после любого нового запроса к таблице следуют запросы select/alter/update, он всегда выдает "пользователю не хватает объекта привилегий". В действительности, запросы на создание после выполнения с помощью Java-инструкций никогда не передаются в БД, и они не сохраняются, и мы запускаем наш выбор / изменение / обновление, и это приводит к исключению. Если мы запускаем запросы построчно и фиксируем для каждой строки, мы могли бы избежать этой ошибки.

Другие вопросы по тегам