Hibernate “Grails抛出表格”;xxx“;找不到

Hibernate “Grails抛出表格”;xxx“;找不到,hibernate,grails,h2,Hibernate,Grails,H2,在Grails中,我可以在BootStrap中为内存中的H2数据源创建域对象,并返回结果,但一旦应用程序启动(例如来自GSP或controller的查询),并尝试运行查询,我会得到以下结果: org.h2.jdbc.JdbcSQLException: Table "FUNCTIONAL_DOC_TYPE" not found; SQL statement: select this_.id as id1_0_, this_.version as version1_0_, this_.directi

在Grails中,我可以在BootStrap中为内存中的H2数据源创建域对象,并返回结果,但一旦应用程序启动(例如来自GSP或controller的查询),并尝试运行查询,我会得到以下结果:

org.h2.jdbc.JdbcSQLException: Table "FUNCTIONAL_DOC_TYPE" not found; SQL statement:
select this_.id as id1_0_, this_.version as version1_0_, this_.direction_id as direction3_1_0_, this_.functional_group_id as functional4_1_0_, this_.type_name as type5_1_0_ from functional_doc_type this_ [42102-147]
 at org.h2.message.DbException.getJdbcSQLException(DbException.java:327)
 at org.h2.message.DbException.get(DbException.java:167)
 at org.h2.message.DbException.get(DbException.java:144)
 at org.h2.command.Parser.readTableOrView(Parser.java:4562)
 at org.h2.command.Parser.readTableFilter(Parser.java:1020)
 at org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1622)
 at org.h2.command.Parser.parseSelectSimple(Parser.java:1729)
 at org.h2.command.Parser.parseSelectSub(Parser.java:1616)
 at org.h2.command.Parser.parseSelectUnion(Parser.java:1461)
 at org.h2.command.Parser.parseSelect(Parser.java:1449)
 at org.h2.command.Parser.parsePrepared(Parser.java:401)
 at org.h2.command.Parser.parse(Parser.java:275)
 at org.h2.command.Parser.parse(Parser.java:247)
 at org.h2.command.Parser.prepare(Parser.java:201)
 at org.h2.command.Parser.prepareCommand(Parser.java:214)
 at org.h2.engine.Session.prepareLocal(Session.java:425)
 at org.h2.engine.Session.prepareCommand(Session.java:374)
 at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1056)
 at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:71)
 at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:233)
 at org.apache.commons.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:281)
 at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:313)
 at org.grails.datastore.gorm.GormStaticApi.findAll(GormStaticApi.groovy:374)
域类:

class FunctionalDocType {
    String typeName
    FunctionalGroup functionalGroup
    DocDirection direction

    static constraints = {
        functionalGroup(nullable: true)
    }

}
Bootstrap.groovy:

   new FunctionalDocType(typeName: 'Order',   direction: buyerToSeller, functionalGroup: orders).save().save(flush: true)

   //  insert into functional_doc_type (id, version, direction_id, functional_group_id, type_name) values (null, ?, ?, ?, ?)


   FunctionalDocType.findAll() runs:

    // DEBUG SQL - select this_.id as id1_0_, this_.version as version1_0_, this_.direction_id as direction3_1_0_, this_.functional_group_id as functional4_1_0_, this_.type_name as     type5_1_0_ from functional_doc_type this_
并返回所有正确的值

因此,它就像是在引导之后某个地方内存中的tabe被删除了,但这并没有被记录

谢谢你的帮助

谢谢


Steve

大多数内存数据库都将数据库绑定到所使用的连接。Hibernate为每个会话打开一个连接,因此只有具有SchemaExport的会话才具有具有正确架构的数据库,并立即被释放。要解决此问题,必须对访问inmemory数据库的所有会话使用相同的连接

connection = session.getConnection();

sessionfactory.openSession(connection);

H2在最后一个连接关闭时关闭数据库。对于内存中的数据库,关闭连接意味着数据丢失

因此,如果你一直保持一个连接打开,那么你应该没事。你可以称之为“哨兵”连接


另一种选择是使用持久化数据库(数据库URL
jdbc:h2:~/test/app_data;MVCC=TRUE

如果使用持久化数据库(数据库URL
jdbc:h2:~/test/app_data;MVCC=TRUE
)是否有效?+1感谢Thomas的回答;这似乎确实有效。我仍然不确定它为什么不能以第一种方式工作,我还没有听到Grails小组的消息,但我认为持久化数据存储应该适合我的用例。再次感谢你,谢谢菲罗,这是我学到的一课。我假设,因为Grails默认的开发模式是使用内存中的,所以我相信这不会发生。所以我想如果我没有在引导上运行DB操作,那么我就不会看到这个问题。无论如何,多亏了你和托马斯,我有两个很好的选择去探索,并学到了更多关于内存数据库的知识。干杯
connection = session.getConnection();

sessionfactory.openSession(connection);