Grails Scaffolding 的 MongoDB 问题(在 MySQL 中不会发生)
Posted
技术标签:
【中文标题】Grails Scaffolding 的 MongoDB 问题(在 MySQL 中不会发生)【英文标题】:MongoDB issues with Grails Scaffolding (do not occur in MySQL) 【发布时间】:2012-08-14 06:52:48 【问题描述】:我尝试使用 MongoDB 2.0.6 替换 mysql 5.5.25 来测试 Grails 2.1 应用程序,但遇到了一些奇怪的问题。
使用 MongoDB 而不是 MySQL 时的问题:
使用 Scaffolding 时,我无法使用静态约束对字段进行排序
当我将 inList 指定为约束时,在使用 MySQL 后端时会得到一个下拉菜单,但在使用 MongoDB 后端时会得到一个字段。
在指定 blank=false
约束的字段上没有 *(星号)。
域类:
package study
class Student
String login
String firstName
String lastName
String gender
Boolean active
Date dateCreated
Date lastUpdated
static constraints =
login()
firstName(blank: false)
lastName(blank: false)
gender(inList: ['M', 'F'])
active()
控制器
package study
class StudentController
def scaffold = true
DataSource.groovy(MySQL 的东西被注释掉了):
grails
mongo
host = "dev-linux"
port = 27017
username = "study"
password= "********"
databaseName = "study"
//dataSource
// pooled = true
// driverClassName = "com.mysql.jdbc.Driver"
// dialect = "org.hibernate.dialect.MySQL5InnoDBDialect"
// username = "study"
// password = "********"
// dbCreate = "create-drop" // one of 'create', 'create-drop','update'
// url = "jdbc:mysql://dev-linux:3306/study"
//
//
//hibernate
// cache.use_second_level_cache = true
// cache.use_query_cache = true
// cache.provider_class = "net.sf.ehcache.hibernate.EhCacheProvider"
//
BuildConfig.groovy(显示的插件部分是我将 MongoDB 替换为 MySQL 所做的全部更改,该文件的其余部分是 Grails 创建的默认文件)
plugins
// build ":hibernate:$grailsVersion"
// compile ":mysql-connectorj:5.1.12"
compile ":mongodb:1.0.0.GA"
build ":tomcat:$grailsVersion"
我对 MongoDB 和 MySQL 所做的唯一更改是对上面显示的 DataSource.groovy 和 BuildConfig.groovy 的更改。
我是否缺少任何配置项?
我确实看到有人在 Nabble forum post 上提到字段排序可能是 MongoDB 的问题。
但是,这篇文章没有任何细节。
另外,我不明白后端数据库引擎在使用脚手架时为什么或如何影响视图的呈现方式。具体来说,页面上的排序和下拉 vs 文本字段。
我原以为这会来自域类的字段类型和约束。
以前在 MongoDB 中使用 Grails+Scaffolding 时,有没有人遇到过这种奇怪的行为?有谁知道修复或有任何见解?
非常感谢您,我很感激。
【问题讨论】:
【参考方案1】:MongoDB 的脚手架可以工作,问题是如果你只安装 mongodb 插件,grails 会看到模棱两可的域映射和类似的错误弹出。您需要:
像这样删除休眠插件:
grails uninstall-plugin hibernate
同时从 BuildConfig.groovy 中删除这些行:
runtime ":database-migration:1.1"
runtime ":hibernate:$grailsVersion"
通过添加这一行来明确地告诉给定域由 Mongo 持久化:
static mapWith="mongo"
【讨论】:
谢谢,拉斐尔。关于您的第一点,我使用 IntelliJ,并且我很确定当我从 BuildConfig.groovy 中评论该依赖项时,Hibernate 插件已被删除。我相信当您从 BuildConfig.groovy 中注释某些内容时,IntelliJ 会运行grails uninstall-plugin
。但是,我将返回并在 .grails 目录中再次检查 Hibernate 插件确实已消失。我确实确实摆脱了您提到的 BuildConfig.groovy 中的这两行。我不知道static mapWith="mongo"
,谢谢你提供的信息,我会试试的。
你也注释掉了迁移插件吗?它似乎依赖于休眠,因此它可能会暂时重新安装它。 - github.com/grails-plugins/grails-database-migration/blob/master/…
是的,我确实删除了迁移插件。我相信在创建应用程序时默认添加了它,但我肯定删除了它。谢谢。
嗨拉斐尔,非常感谢您的建议。我赞成您的有见地的回答,但在尝试以下操作后我仍然看到问题:1. Ran grails uninstall-plugin hibernate
只是为了确定。收到消息| Warning No plugin [hibernate] installed, cannot uninstall
(这是我所期望的)。 2. 验证 BuildConfig.groovy 没有数据库迁移、休眠插件。 3. 为Student域类添加static mapWith = "mongo"
,明确指定它由MongoDB持久化。
尝试下载并运行此示例应用程序github.com/xymor/grails-mongo-sample 并与您自己的代码进行比较或分享您的代码,以便我可以帮助您调试它。以上是关于Grails Scaffolding 的 MongoDB 问题(在 MySQL 中不会发生)的主要内容,如果未能解决你的问题,请参考以下文章