Anomalie #311
Méthode clear provoque une erreur sous PostgreSQL
| Status: | Nouveau | Start date: | 02/12/2010 | |
|---|---|---|---|---|
| Priority: | Normal | Due 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