2010-10-12 1 views
1

Я использую спящий режим, как мой провайдер 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

Все еще сталкивается с этой проблемой? –

+0

@David Большое спасибо за продолжение. Да, это все еще подслушивало меня, но теперь я понял, что заставило его распечатать. См. Комментарий, который я добавил к ответу Паскаля. – AmanicA

+0

Отлично. Просто хотел убедиться, что тебя позаботились. Если бы в этом отношении были какие-то функции, которые вы хотели получить от OpenEJB, просто дайте мне знать. –

ответ

3

Поскольку вы» re с использованием базы данных в памяти, неудивительно, что последовательность, как и любой другой объект базы данных, отсутствует во время экспорта. Но я не знаю, почему вы получаете такую ​​полную стеклу. Я просто попытался с основным тестом, и вот что я получаю:

 
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

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

Спасибо, но, как указано в ответе Паскаля, проблема заключается в том, что спящий режим сбрасывает/создает последовательности, но ошибка действительно должна игнорироваться. – AmanicA

Смежные вопросы