在 grails3 中使用 mongodb 和休眠
Posted
技术标签:
【中文标题】在 grails3 中使用 mongodb 和休眠【英文标题】:Using mongodb and hibernate with grails3 【发布时间】:2016-12-14 07:47:51 【问题描述】:我需要针对 mysql/Hibernate 和 MongoDB 运行 Grails 3 应用程序。 (Had 在 Grails 2.5 上运行顺利)。
我尝试了许多不同的组合,搜索并尝试了相关的 SO 答案,但没有运气。
使用最新的Mongodb插件文档进行配置。
使用 Grails 3.1.10:
grailsVersion=3.1.10
我从 build.gradle 中的以下细节开始:
buildscript
ext
grailsVersion = project.grailsVersion
repositories
mavenLocal()
maven url "https://repo.grails.org/grails/core"
dependencies
classpath "org.grails:grails-gradle-plugin:$grailsVersion"
classpath "com.bertramlabs.plugins:asset-pipeline-gradle:2.8.2"
classpath "org.grails.plugins:hibernate4:5.0.10"
...
dependencies
compile "org.springframework.boot:spring-boot-starter-logging"
compile "org.springframework.boot:spring-boot-autoconfigure"
compile "org.grails:grails-core"
compile "org.springframework.boot:spring-boot-starter-actuator"
compile "org.springframework.boot:spring-boot-starter-tomcat"
compile "org.grails:grails-dependencies"
compile "org.grails:grails-web-boot"
compile "org.grails.plugins:cache"
compile "org.grails.plugins:scaffolding"
compile "org.grails.plugins:hibernate4"
compile "org.hibernate:hibernate-ehcache"
console "org.grails:grails-console"
profile "org.grails.profiles:web"
runtime "com.bertramlabs.plugins:asset-pipeline-grails:2.8.2"
testCompile "org.grails:grails-plugin-testing"
testCompile "org.grails.plugins:geb"
testRuntime "org.seleniumhq.selenium:selenium-htmlunit-driver:2.47.1"
testRuntime "net.sourceforge.htmlunit:htmlunit:2.18"
//databases
compile 'org.grails.plugins:mongodb:6.0.0.M2'
runtime 'mysql:mysql-connector-java:5.1.36'
...
application.yml:
---
hibernate:
cache:
queries: false
use_second_level_cache: true
use_query_cache: false
region.factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
dataSource:
pooled: true
jmxExport: true
driverClassName: com.mysql.jdbc.Driver
environments:
development:
dataSource:
dbCreate: update
url: jdbc:mysql://localhost:3306/dbname
driverClassName: com.mysql.jdbc.Driver
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
username : "xxx"
password : "yyy"
properties:
maxActive : 50
maxIdle: 25
minIdle: 5
...
grails:
mongodb:
host: "localhost"
port: 27017
username: "blah"
password: "blah"
databaseName: "foo"
现在这给了我一个错误:
15:13:58.001 [QUIET] [system.out] ERROR org.springframework.boot.SpringApplication - Application startup failed
15:13:58.001 [QUIET] [system.out] java.lang.NoClassDefFoundError: org/grails/datastore/gorm/plugin/support/ConfigSupport
15:13:58.001 [QUIET] [system.out] at grails.plugins.mongodb.MongodbGrailsPlugin.doWithSpring(MongodbGrailsPlugin.groovy:42)
MongoDB grails 插件找不到ConfigSupport
ConfigSupport.prepareConfig(config, (ConfigurableApplicationContext) applicationContext)
然后我尝试以所有可能的顺序添加以下插件:
//compile 'org.grails:grails-datastore-gorm-hibernate4:6.0.0.M2'
//compile 'org.grails:grails-datastore-core:4.0.0.M2'
//compile 'org.grails:grails-datastore-gorm-plugin-support:6.0.0.M2'
//compile 'org.springframework.data:spring-data-mongodb:1.9.2.RELEASE'
//compile 'org.mongodb:mongodb-driver:3.3.0'
//compile 'org.mongodb:mongo-java-driver:3.3.0'
运气不好。
我还将 mongodb: 部分移至 yml 文件中的 grails: 部分。同样的错误。
所以问题是如何使用 grails3 让 MongoDB 与 MySql 一起运行。
【问题讨论】:
【参考方案1】:好吧,我傻了。我使用这些简单的依赖设置解决了这个难题:
compile "org.springframework.boot:spring-boot-starter-logging"
compile "org.springframework.boot:spring-boot-autoconfigure"
compile "org.grails:grails-core"
compile "org.springframework.boot:spring-boot-starter-actuator"
compile "org.springframework.boot:spring-boot-starter-tomcat"
compile "org.grails:grails-dependencies"
compile "org.grails:grails-web-boot"
compile "org.grails.plugins:cache"
compile "org.grails.plugins:scaffolding"
compile "org.grails.plugins:hibernate4"
compile "org.hibernate:hibernate-ehcache"
console "org.grails:grails-console"
profile "org.grails.profiles:web"
runtime "com.bertramlabs.plugins:asset-pipeline-grails:2.8.2"
testCompile "org.grails:grails-plugin-testing"
testCompile "org.grails.plugins:geb"
testRuntime "org.seleniumhq.selenium:selenium-htmlunit-driver:2.47.1"
testRuntime "net.sourceforge.htmlunit:htmlunit:2.18"
//databases
compile 'org.grails.plugins:mongodb'
runtime 'mysql:mysql-connector-java:5.1.36'
runtime 'com.googlecode.json-simple:json-simple:1.1'
似乎下面这行有所不同:
compile 'org.grails.plugins:mongodb'
省略版本号。这应该在文档中更好地解释。通常定义版本是件好事,还是现在这太过时了? :-)
很高兴让它工作
【讨论】:
【参考方案2】:好的,我找到了正确的先前引用 mongodb 插件的答案,即compile 'org.grails.plugins:mongodb'
但我想总结一个简短的清单,让我有一个正确运行的混合解决方案(hibernate + mysql 和 mongodb) ,经过多次试验和错误。 所以,为了拥有混合的 mysql/mongo grails3 配置,您必须
-
在 build.gradle 中插入 compile 'org.grails.plugins:mongodb'(没有任何版本)(记住 grails 3 中没有 BuildConfig.groovy,如 documented here/grails2->3)
保持对hibernate/mysql的普通依赖,例如:
compile 'org.grails.plugins:hibernate4' compile 'org.hibernate:hibernate-ehcache' runtime 'mysql:mysql-connector-java:5.1.38'
在 application.yml 中正确设置连接,但我更喜欢旧式 application.groovy,在 grails-app/conf 中(如在旧 GRAILS 中),如下所示(请记住,在 GRAILS3 中与 2 不同,您必须使用 mongodb,不再有 mongo 关键字)
使用普通的 GRAILS 实体进行 mysql 映射
并在 mongo 实体中使用 static mapWith="mongo"
(如 GRAILS-mongo doc 中所述)
mongo 不使用通常的mysql Long id,而是ObjectId id
,而import org.bson.types.ObjectId
Application.groovy 设置
grails
mongodb
host = "localhost"
port = 27017
username = mongouser
password= mongopasswd
databaseName = mongoDBname
environments
development
dataSource
driverClassName = "com.mysql.jdbc.Driver"
username = ...
password = ...
dbCreate = "create"
url = "jdbc:mysql://127.0.0.1:3306/dbnameMysql"
就是这样。享受 MongoDB。
【讨论】:
【参考方案3】:除了显示已确认有效的配置外,我不确定我能提供多少帮助。 我最近将一个 2.4.4 应用程序转换为 3.1.8,诚然我使用 Oracle 作为我的 RDBMS 而不是 mysql。
在 build.gradle 我只有:
dependencies
classpath "org.grails.plugins:hibernate4:5.0.6"
...
dependencies
compile "org.grails.plugins:mongodb:5.0.0.RC1"
...
在 application.yml 中:
mongodb:
databaseName: 'myApp'
engine: mapping
引擎:映射位对我来说至关重要,它恢复到之前的持久性引擎,如此处所述http://gorm.grails.org/latest/mongodb/manual/index.html
我的 MongodbGrailsPlugin.groovy 中的 doWithSpring() 闭包看起来像:
Closure doWithSpring()
def initializer = new MongoDbDataStoreSpringInitializer(config, grailsApplication.getArtefacts(DomainClassArtefactHandler.TYPE).collect() GrailsClass cls -> cls.clazz )
initializer.registerApplicationIfNotPresent = false
initializer.setSecondaryDatastore( manager.hasGrailsPlugin("hibernate") )
return initializer.getBeanDefinitions((BeanDefinitionRegistry)applicationContext)
没有对可能已在您的更高版本中添加(或未添加)或缺少依赖项的 ConfigSupport 的引用。
【讨论】:
以上是关于在 grails3 中使用 mongodb 和休眠的主要内容,如果未能解决你的问题,请参考以下文章
使用 MongoDB 休眠 OGM - 创建 EntityManagerFactory 时出现 ClassNotFoundException