2016-08-08 13 views
2

Ich brauche/Hibernate und MongoDB ein Grails 3 App gegen MySql laufen. (Had läuft ohne Probleme auf Grails 2.5).Mit mongodb und Hibernate mit grails3

Ich versuchte viele verschiedene Kombinationen, suchte und versuchte verwandte SO Antworten, aber ohne Glück.

Verwendet das neueste Mongodb Plugin doc für die Konfiguration.

Mit Grails 3.1.10:

grailsVersion=3.1.10 

I mit folgenden Angaben in build.gradle gestartet:

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' 
    ... 
} 

Die 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" 

Jetzt das gibt mir ein Fehler:

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) 

Der MongoDB Grails Plugin nicht ConfigSupport findet

ConfigSupport.prepareConfig(config, (ConfigurableApplicationContext) applicationContext) 

ich dann versucht, die folgenden Plugins in allen Aufträgen möglich hinzuzufügen:

//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' 

Kein Glück.

Ich zog auch den mongodb: Abschnitt bis hinunter zu dem grails: Abschnitt in der yml Datei. Derselbe Fehler.

Die Frage ist also, wie MongoDB mit MySql mit Grails3 ausgeführt wird.

Antwort

1

Ok, dumm mich. Ich löste das Rätsel diese einfachen Abhängigkeitseinstellungen:

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' 

Es scheint, dass die folgende Zeile den Unterschied gemacht:

compile 'org.grails.plugins:mongodb' 

Weglassen die Versionsnummer. Dies sollte in der Dokumentation etwas besser erklärt werden. Normalerweise ist es eine gute Sache, Versionen zu definieren, oder ist das heutzutage zu altmodisch? :-)

Glücklich haben es

0

Nicht sicher arbeiten ich viel anders als zeigen meine Config helfen kann, die Arbeit bestätigt. Ich habe vor kurzem eine 2.4.4 App auf 3.1.8 konvertiert, zugegebenermaßen verwende ich Oracle als mein RDBMS und nicht als MySQL.

In build.gradle Ich habe gerade:

dependencies { 
classpath "org.grails.plugins:hibernate4:5.0.6" 
... 
} 

dependencies { 
compile "org.grails.plugins:mongodb:5.0.0.RC1" 
... 
} 

Und in der Anwendung.yml:

mongodb: 
    databaseName: 'myApp' 
    engine: mapping 

Der Motor: Mapping Bit war für mich entscheidend, es zur vorherige Persistenz-Engine zurückkehrt, wie hier beschrieben http://gorm.grails.org/latest/mongodb/manual/index.html

Die doWithSpring() Schließung in meinem MongodbGrailsPlugin.groovy wie folgt aussieht:

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) 
} 

Kein Verweis auf ConfigSupport, der in Ihrer späteren Version hinzugefügt wurde (oder nicht) oder eine Abhängigkeit fehlt.

1

Ok ich richtig vorherige Antwort gefunden mongodb Plugin für die Vermittlung, das heißt
compile 'org.grails.plugins:mongodb'
aber ich möchte mit einer kurzen Checkliste zusammenzufassen, mit mir eine richtig läuft Mischlösung (beide Hibernate + mysql und mongodb), nach vielen Versuchen und Fehler.
also ein gemischtes mysql/Mongo grails3 Konfiguration haben, um, müssen Sie

  1. Einsatz Kompilierung 'org.grails.plugins: mongodb' (ohne Fassung) in build.gradle (denken Sie daran, dass es keine BuildConfig.groovy in Grails 3, wie documented here/grails2->3)
  2. halten gewöhnliche Abhängigkeit/mysql zu überwintern, zum Beispiel: compile 'org.grails.plugins:hibernate4' compile 'org.hibernate:hibernate-ehcache' runtime 'mysql:mysql-connector-java:5.1.38'
  3. richtig Verbindungen in application.yml einrichten, aber ich ziehe es im alten Stil application.groovy, in grails- app/conf (wie in älteren GRAILS), wie unten (denken Sie daran, dass in GRAILS3 anders als 2 müssen Sie mongodb und keine MO verwenden re Mongo Stichwort)
  4. Verwendung gewöhnlicher GRAILS Einheiten für mysql-Mapping
  5. und verwenden static mapWith="mongo" innerhalb Mongo Einheiten (wie in GRAILS-mongo doc angegeben)
  6. nicht üblich mysql Lange id für Mongo verwenden, aber ObjectId id, und für sie import org.bson.types.ObjectId


Application.groovy einrichten

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" 
    } 
    } 
} 

Das ist alles. Genieße MongoDB.

Verwandte Themen