2015-04-27 22 views
7

otrzymuję wyjątek, gdy moja nazwa kolumna zawiera myślnik „-”Junit HSQLDB - użytkownik nie ma uprawnień lub przedmiotu nie znaleziono - 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; 

definicja schematu: To jest kwerenda dla tworzenia schematu .

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) 
    ); 

Błąd znajduje się poniżej:

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) 

Może ktoś mi pomóc w ustaleniu tego?

+0

Czy sprawdziłeś dokumentację HSQLDB? Myślę, że nazwy kolumn w podwójnych cudzysłowach mogą uwzględniać wielkość liter. Czy naprawdę potrzebujesz łączników? Zmienilbym je na podkreślenia, czyli standard SQL i tak ... – RudolphEst

+0

@RudolphEst Prawidłowo. Proszę zaksięgować jako odpowiedź. Również THIS_ nie należy używać jako nazwy tabeli. – fredt

Odpowiedz

10

Powodem obiektu nie znaleziono błędu jest fakt, że kolumna oh-ordnbr określa się wielkość liter (to ze względu na cudzysłowach można umieścić wokół niego).

Masz dwa możliwe rozwiązania:

  1. Nie używaj kreski (myślniki) w SQL. To i tak jest zła praktyka, zamiast tego użyj podkreśleń.
  2. Aktualizacja adnotacji WZP następująco:

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

Zdecydowanie zalecamy używanie podkreślenia zamiast kresek, nigdy nie wiesz co niesamowitość różne implementacje JPA może mieć przy korzystaniu z drugiego rozwiązania.

2

Dzięki za odpowiedzi. Jak słusznie zauważyłeś, hsqldb rozróżnia wielkość liter. Zmieniłem definicję schematu i zadziałało to teraz. Ponieważ używamy wcześniej istniejącego db, nie możemy zmienić kodu. Dlatego zmieniam schemat tak samo jak istniejący db.

0

Jeśli skrypty HSQL są uruchamiane przez Javę i jeśli po kwerendy wybierz/zmień/zaktualizuj zapytanie nowej kwerendy, zawsze zgłasza "obiekt braku uprawnień użytkownika". W rzeczywistości tworzenie zapytań po wykonaniu przy pomocy instrukcji Java nigdy nie zostaje przypisane do bazy danych i nie jest zachowywane, a my uruchamiamy naszą komendę select/alter/update i powoduje to wyjątek. Jeśli uruchomimy zapytania wiersz po wierszu i zatwierdzimy dla każdego wiersza, możemy uniknąć tego błędu.

0

Sprawdź, czy twój plik konfiguracyjny ma poprawnego dostawcę, Naprawiłem ten sam problem, dostarczając dostawcę org.hibernate.ejb.HibernatePersistence.