使用grails控制台创建的新域对象在dbconsole中不可见

时间:2013-10-23 13:06:06

标签: grails groovy gorm h2

我试图在this guide的帮助下在grails控制台中创建一个新的域对象。 根据控制台输出,创建了新对象:

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中不可见 当我连接到DevS环境的JDBC url时,表BOOK就出现了,如DataSource.groovy所示:

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

但是select返回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 build,即2.3.1
嵌入式H2数据库vrsion = H2 1.3.173(2013-07-28)

3 个答案:

答案 0 :(得分:5)

我认为问题是数据库被锁定了。让我们试试这个(对我的实验有效):

编辑你的grails-app / conf / spring / 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-app / 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 

但从列表中选择[Generic H2 Server]并在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)

答案 1 :(得分:0)

我建议改变

dbCreate =“create-drop”

dbCreate =“update”

在您的DataSource.groovy上再试一次

答案 2 :(得分:0)

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

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

对网址的简单更改有效,感谢尼克 - :)