2010-10-12 1 views
1

J'utilise hibernent mon fournisseur JPA et que vous voulez pour créer un hsqldb en mémoire au démarrage en utilisant: hibernate.hbm2ddl.auto = créermise en veille prolongée création automatique des hsqldb en mémoire provoque Séquence non trouvée

Mais pour une raison quelconque, je reçois des exceptions comme ci-dessous dans mes journaux. Les choses semblent fonctionner autrement. Est-ce un problème hibernate ou hsqldb?

Je suis limité à l'utilisation JPA 1 donc je suis en utilisant hsqldb 1.8.0.10 et mise en veille prolongée 3.3.0.SP1

Ceci est similaire à: Internal HSQL database complains about privileges

 
ERROR - 4. Statement.executeUpdate(drop sequence DDS_EMAIL_STATUS_SEQ) FAILED! drop sequence DDS_EMAIL_STATUS_SEQ {FAILED after 0 msec} 
java.sql.SQLException: Sequence not found in statement [drop sequence DDS_EMAIL_STATUS_SEQ] 
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source) 
    at org.hsqldb.jdbc.jdbcStatement.executeUpdate(Unknown Source) 
    at net.sf.log4jdbc.StatementSpy.executeUpdate(StatementSpy.java:694) 
    at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228) 
    at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228) 
    at org.hibernate.tool.hbm2ddl.SchemaExport.execute(SchemaExport.java:383) 
    at org.hibernate.tool.hbm2ddl.SchemaExport.drop(SchemaExport.java:358) 
    at org.hibernate.tool.hbm2ddl.SchemaExport.execute(SchemaExport.java:258) 
    at org.hibernate.tool.hbm2ddl.SchemaExport.create(SchemaExport.java:211) 
    at org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:343) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1327) 
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669) 
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:132) 
    at org.apache.openejb.assembler.classic.PersistenceBuilder.createEntityManagerFactory(PersistenceBuilder.java:184) 
    at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:490) 
    at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:450) 
    at org.apache.openejb.assembler.classic.Assembler.buildContainerSystem(Assembler.java:368) 
    at org.apache.openejb.assembler.classic.Assembler.build(Assembler.java:280) 
    at org.apache.openejb.OpenEJB$Instance.(OpenEJB.java:125) 
    at org.apache.openejb.OpenEJB$Instance.(OpenEJB.java:60) 
    at org.apache.openejb.OpenEJB.init(OpenEJB.java:271) 
    at org.apache.openejb.OpenEJB.init(OpenEJB.java:250) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.openejb.loader.OpenEJBInstance.init(OpenEJBInstance.java:36) 
    at org.apache.openejb.client.LocalInitialContextFactory.init(LocalInitialContextFactory.java:71) 
    at org.apache.openejb.client.LocalInitialContextFactory.init(LocalInitialContextFactory.java:53) 
    at org.apache.openejb.client.LocalInitialContextFactory.getInitialContext(LocalInitialContextFactory.java:42) 
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667) 
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288) 
    at javax.naming.InitialContext.init(InitialContext.java:223) 
    at javax.naming.InitialContext.(InitialContext.java:197) 
+0

Vous rencontrez toujours ce problème? –

+0

@David Merci beaucoup pour le suivi. Oui, ça m'embêtait encore, mais j'ai maintenant compris ce qui l'a fait imprimer. Voir le commentaire que j'ai ajouté à la réponse de Pascal. – AmanicA

+0

Génial. Je voulais juste m'assurer que vous étiez pris en charge. S'il y avait des fonctionnalités que vous vouliez sur OpenEJB à cet égard, faites le moi savoir. –

Répondre

3

Puisque vous En utilisant une base de données en mémoire, il n'est pas surprenant qu'une séquence, comme n'importe quel autre objet de base de données, ne soit pas là lors de l'export. Mais je ne sais pas pourquoi vous obtenez une pile complète comme celle-ci. Je viens d'essayer avec un test de base et voici ce que je reçois:

 
16:27:07.708 [main] DEBUG o.h.tool.hbm2ddl.SchemaExport - Unsuccessful: drop sequence MY_ENTITY_SEQ 
16:27:07.709 [main] DEBUG o.h.tool.hbm2ddl.SchemaExport - Sequence not found in statement [drop sequence MY_ENTITY_SEQ] 

En d'autres termes, elle « échoue » en silence.

Peut-être que vous pourriez essayer de prolonger la HSQLDialect et remplacer la méthode suivante:

protected String getDropSequenceString(String sequenceName) { 
    return "drop sequence " + sequenceName; 
} 

dans:

protected String getDropSequenceString(String sequenceName) { 
    return "drop sequence " + sequenceName + " if exists"; 
} 

Non testé cependant.

+0

Merci beaucoup d'avoir essayé cela. J'ai maintenant compris que org.lazyluke: log4jdbc-remix: 0.2.4 est celui qui l'affiche. Si je commente ce qui suit à partir de mes propriétés log4j.properties alors ces traces de pile disparaissent "log4j.logger.jdbc.sqlonly = info". Je ne suis pas vraiment sûr de comment je peux me débarrasser de cela, peut-être que je peux configurer log4j pour l'ignorer d'une manière ou d'une autre. – AmanicA

1

Voici une technique que j'aime utiliser pour obtenir une nouvelle base de données en mémoire à chaque test.

@Override 
public void setUp() throws Exception { 
    Properties p = new Properties(); 
    p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory"); 
    p.put("movieDatabase", "new://Resource?type=DataSource"); 
    p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver"); 
    p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb" + System.currentTimeMillis()); 
    p.put("openejb.embedded.initialcontext.close", "DESTROY"); 

    initialContext = new InitialContext(p); 
} 

@Override 
protected void tearDown() throws Exception { 
    initialContext.close(); 
} 

Fondamentalement, donner un nom de base de données unique en annexant System.currentTimeMillis() et reconstruire le conteneur embarqué pour chaque test.

Vous empêche d'avoir à nettoyer après vos tests mais ne nécessite pas de nouveau jvm pour chaque test.

+0

Merci, mais comme indiqué dans la réponse de Pascal, le problème est avec la mise en veille prolongée/la création des séquences, mais l'erreur doit vraiment être ignorée. – AmanicA

Questions connexes