2010-10-12 48 views
1

我使用Hibernate作爲我的JPA提供者和想用它來創建啓動時 內存HSQLDB: hibernate.hbm2ddl.auto =創建冬眠自動創建內存HSQLDB導致序列沒有發現

但由於某種原因,我在我的日誌中會收到下面的例外情況。 事情似乎工作,否則。它是一個休眠或hsqldb問題?

我僅限於使用JPA 1所以我用 HSQLDB 1.8.0.10和休眠3.3.0.SP1

這是類似的: 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

仍然遇到這個問題? – 2010-10-29 20:05:36

+0

@David非常感謝您的跟蹤。是的,它仍在擾亂我,但我現在想出了什麼導致它被打印出來。看到我添加到帕斯卡答案的評論。 – AmanicA 2010-10-30 01:35:20

+0

太好了。只是想確保你被照顧好了。如果在這方面有任何你想要的OpenEJB功能,請告訴我。 – 2010-10-30 05:23:03

回答

3

既然你」重新使用內存數據庫時,像任何其他數據庫對象一樣,序列在導出時並不存在,這並不奇怪。但我不知道你爲什麼得到像這樣的完整堆棧跟蹤。我只是想一個基本的測試案例,這裏是我所得到的:

 
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] 

換句話說,它「失敗」悄無聲息。

也許你可以儘量延長HSQLDialect並覆蓋下面的方法:

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

到:

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

雖然沒有測試。

+0

非常感謝您嘗試瞭解這一點。我現在想通了org.lazyluke:log4jdbc-remix:0.2.4是打印出來的。如果我從log4j.properties註釋掉以下內容,那麼這些堆棧跟蹤消失「log4j.logger.jdbc.sqlonly = info」。我真的不知道如何擺脫這種情況,也許我可以配置log4j以某種方式跳過它。 – AmanicA 2010-10-30 01:34:20

1

下面是我喜歡用來獲取每次測試的新內存數據庫的技術。

@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(); 
} 

基本上,通過附加System.currentTimeMillis()給唯一的數據庫名稱,並重建所述嵌入式容器爲每個測試。

讓您不必在完成測試後進行清理,但每次測試都不需要新的jvm。

+0

謝謝,但正如Pascal的回答中所述,問題在於使用hibernate刪除/創建序列,但錯誤應該被忽略。 – AmanicA 2010-10-30 01:41:24