Grails MissingMethodException尝试对多个数据源项目执行操作(使用Java实体)

Grails MissingMethodException尝试对多个数据源项目执行操作(使用Java实体),grails,groovy,datasource,Grails,Groovy,Datasource,我试图在Grails2.2.1中使用多个数据源,但在访问其他数据源时遇到了一些问题,而不是默认情况。在POJO而不是POGO文件中观察到该问题。 问题是,当我尝试从非默认数据源调用任何特定于持久性的操作(如save,list)时,会抛出MissingMethodException,示例如下。我不知道出了什么问题。我遵循了grails教程。 def entity=new MyEntity entity.myNonDefaultDatasource.save 此问题可通过以下编码流程实现: 创建

我试图在Grails2.2.1中使用多个数据源,但在访问其他数据源时遇到了一些问题,而不是默认情况。在POJO而不是POGO文件中观察到该问题。 问题是,当我尝试从非默认数据源调用任何特定于持久性的操作(如save,list)时,会抛出MissingMethodException,示例如下。我不知道出了什么问题。我遵循了grails教程。

def entity=new MyEntity entity.myNonDefaultDatasource.save 此问题可通过以下编码流程实现: 创建一个新的Grails应用程序

为我的实体类创建新包

使用JPA注释创建实体代码

封装测试数据库; 导入javax.persistence.Entity; 导入javax.persistence.Id; @实体 公共类MyEntity{ @身份证 私人长id; 私有字符串名称; 公共无效setIdlong id{ this.id=id; } 公共长getId{ 返回此.id; } public void setNamefinal字符串名{ this.name=名称; } 公共字符串getName{ 返回此.name; } } 编辑Grails数据源配置文件

数据源{ 汇集=真 driverClassName=org.h2.Driver 用户名=sa 密码= } //******添加了数据源 数据源_a2{ 汇集=真 driverClassName=org.h2.Driver 用户名=sa 密码= } 冬眠{ cache.use_second_level_cache=true cache.use\u query\u cache=false cache.region.factory_class='net.sf.ehcache.hibernate.EhCacheRegionFactory' } //特定于环境的设置 环境{ 发展{ 数据源{ dbCreate=create drop//“创建”、“创建drop”、“更新”、“验证”中的一个, url=jdbc:h2:mem:devDb;MVCC=TRUE;锁超时=10000 } 数据源_a2{ dbCreate=createdrop url=jdbc:h2:mem:devDbA2;MVCC=TRUE;锁超时=10000 } } 试验{ 数据源{ dbCreate=update url=jdbc:h2:mem:testDb;MVCC=TRUE;锁超时=10000 } } 生产{ 数据源{ dbCreate=update url=jdbc:h2:prodDb;MVCC=TRUE;锁超时=10000 汇集=真 性质{ maxActive=-1 地雷可杀伤性地雷=1800000 timeBetweenEvictionRunsMillis=1800000 numTestsPervictionRun=3 testOnBorrow=true testWhileIdle=true testOnReturn=true validationQuery=选择1 } } } } 为第二个数据源创建hibernate cfg文件

创建一个控制器

编辑控制器

包testmultidb 导入testmultidb.MyEntity 类multdatasources控制器{ def索引{ def entity=new MyEntity entity.id=0 entity.name=某个名称 我的实体 渲染- } } 运行应用程序

通路

http://localhost:8080/TestMultiDB/multDataSources/index
这是意料之中的。可以从Java调用entity.save,因为该方法是通过AST转换添加到域类的,所以它位于字节码中。但是entity.myNonDefaultDatasource.save被添加到元类中,因为数据源是动态的。Java无法调用添加到元类的方法或属性


您可以调用这些方法,但需要让Java代码调用Groovy类中的非动态帮助器方法,然后调用动态方法。

Tanks@BurtBeckwith。我明白了,但是你有没有关于如何让这些助手使用数据源的例子?
$ mkdir src/java/testmultidb
$ vim src/java/testmultidb/MyEntity.java
$ vim grails-app/conf/DataSource.groovy
$ vim grails-app/conf/hibernate/a2_hibernate.cfg.xml
$ grails create-controller testmultidb.MultDataSources
$ vim grails/controllers/testmultidb/MultDataSourcesController.groovy
$ grails run-app
http://localhost:8080/TestMultiDB/multDataSources/index