在我的grails应用程序中,有一个Customer域和相关的customer表。 Java Web应用程序使用另一个数据库,该数据库还具有客户域和相关客户表。
另请注意,这两个应用程序使用两个不同的数据库。
我的grails应用程序中有一个客户搜索屏幕,当用户搜索带有字符串的客户时,我需要在两个数据库中搜索记录。
如何在grails中实现此要求?
我可以在不是由grails生成的数据库表上使用GORM(我想,我可以使用hibernate映射来实现)?
答案 0 :(得分:1)
我们可以通过两种方式实现:
方式1:
在DataSource.groovy中创建两个数据源。 对于已创建的数据库,在定义数据源时不要给出dbcreate选项。这将防止在创建客户对象时,它将仅在Test1数据库中创建记录。 两个数据库都有Customer表。所以我们可以使用GORM访问数据。因为必须在域中定义数据源'ALL'。
Test1的Customer表包含名称和年龄列 Test2的客户表包含姓名,电子邮件和电话。
通过GORM,我们只能访问域属性。所以我只能从Test2的客户表中访问名称。
在DataSource.groovy中,
dataSource {
pooled = true
driverClassName = "com.mysql.jdbc.Driver"
username = "admin"
password = "admin"
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = false
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' // Hibernate 3
// cache.region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory' // Hibernate 4
}
// environment specific settings
environments {
development {
dataSource {
dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:mysql://localhost:3306/test1"
}
dataSource_test2 {
driverClassName = 'com.mysql.jdbc.Driver'
username = "admin"
password = "admin"
url = "jdbc:mysql://localhost:3306/test2"
}
}
test {
dataSource {
dbCreate = "update"
url =
"jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
}
}
..........
.......
在Customer.groovy中,
class Customer {
static constraints = {
}
String name
int age
static mapping = {
datasource 'ALL'
}
}
在控制器中,
class CustomerController {
def dataSource_test2
def testingDB(){
Customer.test2.list().each{
println it.name
}
println Customer.list()
render "hi"
}
}
方式2:
class MainController {
def dataSource_test2
def index() {
String nameSql = "select * from customer"
Sql sql = new Sql(dataSource_test2)
def rows = sql.rows(nameSql)
println rows
}
}
答案 1 :(得分:1)
这个直接的方法有以下几个选项:
1.您可能需要在数据源groovy文件上为其他Java Web应用程序的数据库源定义新的数据库环境。
newenvironmentname {
dataSource {
dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:mysql://localhost:3306/test1"
}
然后在您想要在控制器上访问此数据源时加载或切换到环境中。
2.您需要使用groovy和
定义sql连接import groovy.sql.Sql
sql = Sql.newInstance( 'jdbc:jtds:sqlserver:
//serverName/dbName-CLASS;domain=domainName', 'username', 'password'
,'net.sourceforge.jtds.jdbc.Driver' )
sql.eachRow( 'select * from tableName' )
{ println "$it.id -- ${it.firstName} --" }
这可能不是最好的方法......