Anomalie #311

Méthode clear provoque une erreur sous PostgreSQL

Added by Florian DESBOIS over 3 years ago. Updated about 1 year ago.

Status:NouveauStart date:02/12/2010
Priority:NormalDue date:
Assignee:-% Done:

0%

Category:-Spent time:-
Target version:-

Description

La méthode clear sur le TopiaContext fonctionne parfaitement pour H2 mais provoque une exception pour PostgreSQL :

Caused by: org.hibernate.exception.SQLGrammarException: could not execute native bulk manipulation query
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
        at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:198)
        at org.hibernate.impl.SessionImpl.executeNativeUpdate(SessionImpl.java:1191)
        at org.hibernate.impl.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:357)
        at org.nuiton.topia.framework.TopiaContextImpl.clear(TopiaContextImpl.java:1207)
        ... 30 more
Caused by: org.postgresql.util.PSQLException: ERREUR: erreur de syntaxe sur ou près de « ALL »
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:304)
        at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:189)
        ... 33 more

La syntaxe suivante semble spécifique à H2 (code de la méthode clear() dans TopiaContextImpl ) :
String sql = "DROP ALL OBJECTS";
if (dropDatabase) {
   sql += " DELETE FILES";
}

History

#1 Updated by Florian DESBOIS over 3 years ago

C'est ennuyeux pour faire des tests unitaires sous PostgreSQL...

#2 Updated by Julien Ruchaud over 3 years ago

Une idée serait d'utiliser le SchemaExport d'hibernate pour supprimer et créer le schema. En cas de grosse base de données, la durée de l'opération peut être important.

configuration.setProperty("hibernate.dialect", "H2";
configuration.setProperty("hibernate.connection.driver_class", "driver");
configuration.setProperty("hibernate.connection.url", "jdbc://");
configuration.setProperty("hibernate.connection.username", "user");
configuration.setProperty("hibernate.connection.password", "passwd");

SchemaExport schemaExport = new SchemaExport(configuration);
schemaExport.drop(true, true);
schemaExport.create(true, true);

#3 Updated by Julien Ruchaud over 3 years ago

Il existe déjà un createSchema, il faudrait juste rajouter un dropSchema.

#4 Updated by Florian DESBOIS over 3 years ago

Ok mais il faudra déprécié la méthode clear alors

Also available in: Atom PDF