2013-10-23 38 views
1

我正尝试在this guide的帮助下在grails控制台中创建一个新的域对象。 据控制台输出的新对象被创建:使用grails控制台创建的新域对象在dbconsole中不可见

grails> shell 
groovy:000> new foo.Book(title: 'bar').save(failOnError: true, flush: true) 
groovy:000> foo.Book : 1 
groovy:000> foo.Book.list() 
groovy:000> [foo.Book : 1] 

但是这本新书的实体不在DBCONSOLE 表BOOK存在,当我与JDBC URL的开发环境连接,如发现可见DataSource.groovy中:

jdbc:h2:mem:devDb;MVCC=TRUE 
username: sa 
password: <blank> 

但一个选择返回0行

相关片DataSource.groovy中配置的(缺省设置)

dataSource { 
    pooled = true 
    driverClassName = "org.h2.Driver" 
    username = "sa" 
    password = "" 
} 
hibernate { 
    cache.use_second_level_cache = true 
    cache.use_query_cache = false 
    cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' // Hibernate 3 
// cache.region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory' // Hibernate 4 
} 

// environment specific settings 
environments { 
    development { 
     dataSource { 
      dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', '' 
      url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000" 
     } 
    } 

当使用控制台而不是groovy shell创建实体时,问题依然存在。

我使用的是最新的Grails建立在这一刻,这是2.3.1
嵌入式数据库H2 = vrsion H2 1.3.173(2013年7月28日)

+0

Found [this](http://stackoverflow.com/questions/2040055/grails-shell-not-seeing-domain-objects)它建议包装保存在交易? –

+0

@tim_yates在你引用的问题中,问题似乎是不能在shell/console中创建对象而不使用事务包装。我的问题是不同的,因为该对象在shell中创建的很好,list()返回该类型的新创建的对象,但该对象在H2 dbconsole中不可见。无论如何,我尝试了事务包装,但结果是一样的。 – nkr1pt

回答

5

我认为问题在于数据库被锁定。让我们试试这个,然后(可在我的实验):

编辑您的grails-app/conf目录/春/ resources.groovy并使它看起来像这样:

// Place your Spring DSL code here 
beans = { 
    h2Server(org.h2.tools.Server, "-tcp,-tcpPort,8043") { bean -> 
     bean.factoryMethod = "createTcpServer" 
     bean.initMethod = "start" 
     bean.destroyMethod = "stop" 
    } 
} 

然后,修改你的Grails应用程序内/conf/DataSource.groovy看起来像这样:

test { 
     dataSource { 
      dbCreate = "update" 
      url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000" 
     } 
} 

现在,你准备添加一些新的对象按教程:

$ grails 
grails> run-app 
grails> shell 
groovy:000> new test.Book(title: 'Book 1').save(failOnError: true) 
===> test.Book : 1 
groovy:000> new test.Book(title: 'Book 2').save(failOnError: true) 
===> test.Book : 2 
groovy:000> test.Book.list() 
===> [test.Book : 1, test.Book : 2] 

要查看H2控制台中,转到

http://localhost:8080/{project}/dbconsole 

但选择[通用H2服务器]从列表中的JDBC URL输入:

jdbc:h2:tcp://localhost:8043/mem:devDb 

和连接。我希望帮助

======================

一点进一步的实验后,似乎锁定了你的问题,你需要连接到H2时使用混合模式方法。你可以在这里阅读更多信息:

http://www.h2database.com/html/features.html#auto_mixed_mode

所以,最简单的做法是使用JDBC连接URL:

url = "jdbc:h2:/tmp/myDB;MVCC=TRUE;LOCK_TIMEOUT=10000;AUTO_SERVER=TRUE" 

为您的应用程序和H2 DBCONSOLE(注意AUTO_SERVER两= TRUE)(不需要修改spring bean)

+0

嗨,尼克,我读到完全相同的结论,同时阅读,令人惊讶的清晰,h2文档;但还没有写下来呢。所以谢谢你的明确解释,这肯定会帮助更多的用户遇到这个问题。有一个upvote和接受的答案;当之无愧 – nkr1pt

+0

很好的答案。只需要清楚,根据文档:AUTO_SERVER = TRUE功能不适用于内存数据库。 –

0

我建议改变

dbCreate的= “创建拖放”

dbCreate的= “更新”

在您的DataSource.groovy上,然后再试一次

+0

我在最初的问题中忘记提到我已经试过这个。 没有骰子...... – nkr1pt

0

当我按照Nick的建议修改Spring bean时,我无法启动run-app并同时启动grails控制台或shell。这是我得到的错误:

消息:创建名为'h2Server'的bean时出错:init方法的调用失败;嵌套异常是org.h2.jdbc.JdbcSQLException:异常打开端口“8043”(端口可能正在使用),原因:“java.net.BindException:地址已在使用中”[90061-173]

简单的更改为网址的工作,谢谢尼克 - :)

+0

这不是问题的答案。 – Nejat