2015-04-27 36 views
7

io sono sempre un'eccezione quando il mio nome colonna contiene trattino "-"Junit HSQLDB - utente non dispone privilegio o oggetto non trovato - 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; 

definizione dello schema: Questa è la query per la creazione dello schema .

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

L'errore è qui sotto:

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) 

Potrebbe qualcuno mi aiuterà a fissare questo?

+0

Avete controllato la documentazione per HSQLDB? Penso che i nomi delle colonne tra virgolette potrebbero essere case sensitive. Hai veramente bisogno dei trattini? Li cambierei in underscore, che è lo standard SQL comunque ... – RudolphEst

+0

@RudolphEst corretto. Si prega di inviare una risposta. Anche THIS_ non deve essere utilizzato come nome tabella. – fredt

risposta

10

La ragione per l'oggetto non trovato errore è il fatto che la colonna oh-ordnbr è definito per essere case sensitive (questo è dovuto alle virgolette si mette intorno ad esso).

Hai due possibili soluzioni:

  1. Non utilizzare trattini (trattini) nel vostro SQL. È comunque una cattiva pratica, usare invece i caratteri di sottolineatura.
  2. Aggiornare l'annotazione APP come segue:

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

vi consiglio vivamente di utilizzare underscore al posto dei trattini, non si sa mai che cosa stranezza diverse implementazioni JPA potrebbero avere quando si utilizza la seconda soluzione.

2

Grazie per le vostre risposte. Come hai giustamente sottolineato, hsqldb è case sensitive. Ho cambiato la definizione dello schema e ha funzionato ora. Dal momento che stiamo usando un db preesistente, non possiamo cambiare il codice. Quindi sto cambiando lo schema stesso del db esistente.

0

Se gli script HSQL vengono eseguiti tramite Java e se qualsiasi nuova query di tabella viene seguita da select/alter/update query, viene sempre visualizzato "utente privo di oggetto privilegio". In realtà, le query create dopo l'esecuzione con Java Statements non vengono mai eseguite nel DB e non vengono mantenute e viene eseguito il nostro select/alter/update e risulta nell'eccezione. Se eseguiamo le interrogazioni riga per riga e commit per ogni riga, potremmo evitare questo errore.

0

Verificare che il file di configurazione abbia il provider corretto, ho risolto lo stesso problema fornendo provider org.hibernate.ejb.HibernatePersistence.

Problemi correlati