在 grails3 中使用 mongodb 和休眠

Posted

技术标签:

【中文标题】在 grails3 中使用 mongodb 和休眠【英文标题】:Using mongodb and hibernate with grails3 【发布时间】:2016-12-14 07:47:51 【问题描述】:

我需要针对 mysql/HibernateMongoDB 运行 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 和休眠的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails 3.x 中安装和使用 MongoDB

Spring中的连接错误,使用Mongodb休眠

使用 MongoDB 休眠 OGM - 创建 EntityManagerFactory 时出现 ClassNotFoundException

无法使用休眠 OGM 从 mongoDB 中删除元素

如何为 mongodb 副本集配置 grails 3

Grails 3.0.1 不支持 application.yml mongo 配置