gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:53:35 27 4
gpt4 key购买 nike

我试图在Grails 2.2.1中使用多个数据源,但是在访问数据源时遇到了一些问题,其他问题则是默认问题。 POJO(不是POGO)文件存在此问题。

问题是,当我尝试从非默认数据源调用任何特定于持久性的操作(例如save(),list())时,会抛出MissingMethodException(以下示例)。我对出什么问题一无所知。我遵循了grails教程(http://grails.org/doc/latest/guide/conf.html#dataSourcesAndEnvironments)。

def entity = new MyEntity()
entity.myNonDefaultDatasource.save()

可以通过以下编码流程解决此问题:

创建一个新的Grails应用程序
$ grails create-app TestMultiDB

为我的实体类创建新的(包)
$ mkdir src/java/testmultidb

使用JPA批注创建实体代码
$ vim src/java/testmultidb/MyEntity.java

package testmultidb;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class MyEntity {

@Id
private long id;

private String name;

public void setId(long id) {
this.id = id;
}

public long getId() {
return this.id;
}

public void setName(final String name) {
this.name = name;
}

public String getName() {
return this.name;
}
}

编辑Grails数据源配置文件
$ vim grails-app/conf/DataSource.groovy

dataSource {
pooled = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}

// ***** Added DataSource
dataSource_a2 {
pooled = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}

hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = false
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
development {
dataSource {
dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
}

dataSource_a2 {
dbCreate = "create-drop"
url = "jdbc:h2:mem:devDbA2;MVCC=TRUE;LOCK_TIMEOUT=10000"
}
}
test {
dataSource {
dbCreate = "update"
url = "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
pooled = true
properties {
maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}
}
}

为第二个数据源创建休眠cfg文件
$ vim grails-app/conf/hibernate/a2_hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
'-//Hibernate/Hibernate Configuration DTD 3.0//EN'
'http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd'>
<hibernate-configuration>
<session-factory>
<mapping class='testmultidb.MyEntity'/>
</session-factory>
</hibernate-configuration>

创建一个 Controller
$ grails create-controller testmultidb.MultDataSources

编辑 Controller
$ vim grails/controllers/testmultidb/MultDataSourcesController.groovy

package testmultidb


import testmultidb.MyEntity

class MultDataSourcesController {

def index() {

def entity = new MyEntity()
entity.id = 0
entity.name = "Some name"

MyEntity.a2.save()

render "-"
}
}

运行应用程序
$ grails run-app

访问
http://localhost:8080/TestMultiDB/multDataSources/index

最佳答案

这是预期的。可以从Java调用entity.save(),因为该方法是通过AST转换添加到域类的,所以它在字节码中。但是由于数据源是动态的,因此entity.myNonDefaultDatasource.save()已添加到元类中。 Java无法调用添加到元类的方法或属性。

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

关于grails - Grails MissingMethodException尝试对多个数据源项目进行操作(使用Java实体),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16092849/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com