J'essaie d'utiliser hsqldb-2.3.4 pour me connecter à partir de l'application Spring.
J'ai créé une base de données en utilisant les détails suivants
Type : HSQL Database Engine Standalone
Driver: org.hsqldb.jdbcDriver
URL: jdbc:hsqldb:file:mydb
UserName: SA
Password: SA
J'ai créé une table nomméeALBUMsous le schéma "MYDB"
Dans le fichier de configuration du printemps:
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dbcpDataSource" />
</bean>
<bean id="dbcpDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:file:mydb" />
<property name="username" value="SA" />
<property name="password" value="SA" />
</bean>
Et dans mon contrôleur de ressort je fais jdbcTemplate.query("SELECT * FROM MYDB.ALBUM", new AlbumRowMapper());
Et ça me donne une exception:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT * FROM MYDB.ALBUM]; nested exception is Java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: ALBUM
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.Java:982)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.Java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.Java:622)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.Java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.Java:729)
org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:52)
Si j'exécute la même requête via l'éditeur SQL de hsqldb, il s'exécutera correctement. Pouvez-vous m'aider s'il vous plaît avec cela.
user lacks privilege or object not found
peut avoir plusieurs causes, la plus évidente étant que vous accédez à une table qui n'existe pas. Une raison moins évidente est que, lorsque vous exécutez votre code, la connexion à une URL de base de données de fichiers peut créer une base de données. Le scénario que vous rencontrez peut être que vous avez configuré une base de données à l'aide du gestionnaire de base de données HSQL, ajouté des tables et des lignes, mais ce n'est pas cette instance spécifique que votre code Java utilise. Vous voudrez peut-être vérifier que vous n'avez pas plusieurs copies de ces fichiers: mydb.log
, mydb.lck
, mydb.properties
, etc. dans votre espace de travail. Si votre code Java a effectivement créé ces fichiers, l’emplacement dépend de la manière dont vous exécutez votre programme. Dans un projet Maven exécuté dans Netbeans par exemple, les fichiers sont stockés à côté du fichier pom.xml.
Si vous avez essayé toutes les autres réponses à cette question, il est fort probable que vous rencontriez un problème de sensibilité à la casse.
HSQLDB est sensible à la casse par défaut. Si vous ne spécifiez pas les guillemets autour du nom d'un schéma, d'une colonne ou d'une table, il le convertira par défaut en majuscule. Si votre objet a été créé en majuscule, vous avez de la chance. S'il est en minuscule, vous devrez alors entourer le nom de votre objet de guillemets doubles.
Par exemple:
CREATE MEMORY TABLE "t1"("product_id" INTEGER NOT NULL)
Pour sélectionner dans cette table, vous devrez utiliser la requête suivante
select "product_id" from "t1"
Comme indiqué par une réponse précédente, il existe de nombreuses causes possibles. L'un d'eux est que la table n'est pas créée en raison d'une incompatibilité de syntaxe. Si une syntaxe ou une fonctionnalité spécifique du fournisseur de base de données est utilisée, HSQLDB ne la reconnaîtra pas . Ensuite, pendant que le code de création est exécuté, vous pouvez voir que la table n'est pas créée pour cette raison de syntaxe. Par exemple, si l'entité est annotée avec @column ("TEXT"), la création de la table échouera.
Il existe un moyen de contourner le problème qui indique à HSQLDB de se trouver dans un mode compatible Pour pgsl, vous devez ajouter votre URL de connexion à celle
"spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_pgs=true"
et pour mysql with
"spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_mys=true"
Oracle
"spring.datasource.url=jdbc:hsqldb:mem:testdb;sql.syntax_ora=true"
notez qu'il existe une variante en fonction de votre configuration Il pourrait s'agir de hibernate.connection.url=
ou spring.datasource.url=
pour ceux qui n'utilisent pas la création de schéma hibernate mais un script SQL, vous devez utiliser ce type de syntaxe dans votre script.
SET DATABASE SQL SYNTAX ORA TRUE;
Il corrigera également les problèmes liés à la syntaxe spécifique du fournisseur dans la requête SQL, tel que array_agg for posgresql
Nota bene : Le problème survient très tôt lorsque le code analyse le modèle pour créer le schéma, puis est caché dans de nombreuses lignes de journaux. Le code unitTested plante alors avec une exception confuse et obscure. erreur non trouvée "qui ne pointe pas du tout le vrai problème. Donc, assurez-vous de lire toute la trace depuis le début et de résoudre tous les problèmes possibles
J'ai eu l'erreur user lacks privilege or object not found
en essayant de créer une table dans une base de données en mémoire vide . J'ai utilisé spring.datasource.schema
et le problème était que j'ai manqué un point-virgule dans mon fichier SQL après la déclaration "CREATE TABLE" par "CREATE INDEX").
J'insérais les données dans hsql db en utilisant le script suivant
INSERT INTO Greeting (text) VALUES ("Hello World");
J'obtenais un problème lié à Hello World objet non trouvé et l'utilisateur de la base de données HSQL ne dispose pas des privilèges ou l'objet non trouvé
que j'ai changé dans le script ci-dessous
INSERT INTO Greeting (text) VALUES ('Hello World');
Et maintenant, ça fonctionne bien.
Lors de l'exécution d'un serveur HSWLDB. Par exemple, votre fichier de configuration Java a:
hsql.jdbc.url = jdbc:hsqldb:hsql://localhost:9005/YOURDB;sql.enforce_strict_size=true;hsqldb.tx=mvcc
assurez-vous que vous avez défini un server.dbname.#
. par exemple mon fichier server.properties:
server.database.0=eventsdb
server.dbname.0=eventsdb
server.port=9005
J'ai eu un problème similaire avec l'erreur 'org.hsqldb.HsqlException: user lacks privilege or object not found: DAYS_BETWEEN
' s'est avéré que DAYS_BETWEEN
n'est pas reconnu par hsqldb en tant que fonction. utilisez DATEDIFF à la place.
DATEDIFF ( <datetime value expr 1>, <datetime value expr 2> )