Grails:使用datasources插件,无法跨不同数据源连接域类

时间:2011-09-12 16:29:41

标签: java hibernate grails

我正在使用这里描述的Grails的数据源:http://burtbeckwith.com/blog/?p=70

我在同一台服务器上连接2个MySQL数据库模式:my_schema_1和my_schema_2。我需要的大部分数据都来自my_schema_1,但其中一个表包含一个引用my_schema_2中其中一个表的列。

以下是我的Datasources.groovy文件中的数据源定义(简化):

datasources = {
    datasource(name: 'my_schema_1') {
        domainClasses([Question, Answer])
        driverClassName('com.mysql.jdbc.Driver')
        url('jdbc:mysql://test.myserver.com/my_schema_1')
        username('***')
        password('***')
    }

    datasource(name: 'my_schema_2') {
        domainClasses([Genre])
        driverClassName('com.mysql.jdbc.Driver')
        url('jdbc:mysql://test.myserver.com/my_schema_2')
        username('***')
        password('***')
    }
}

以下是我的3个类定义:

class Question {
    String text
    Answer answer
    Genre genre
}

class Answer {
    String text
}

class Genre {
    String name
}

每当我尝试对Question类执行条件查询时,我会得到以下映射异常:

An association from the table question refers to an unmapped class: Genre

如果我在Question类中注释掉类型属性,一切正常。如果我对类型类本身执行条件查询, 一切正常。在模式中连接两个类似乎存在问题。 (当然,我也很可能错过了 某事或做错了什么。)

我做错了什么或这是数据源插件的限制?而且,如果这是插件的限制,我可以使用哪些替代方案来实现我的需求?

非常感谢任何帮助/建议。

谢谢,

B.J。

2 个答案:

答案 0 :(得分:3)

datasources插件仅支持数据库之间的弱引用。这意味着您需要自己管理关联的完整性。实现此目的的最佳方法是实现一种能够查询两个域实例并为您提供复合域实例的服务。

您引用的链接会在条目底部注明这一点。此外,这里是grails邮件列表上的same question提出(和回答)。

答案 1 :(得分:1)

我找到了一个更简单的解决方案,因为数据库位于同一台服务器上。

我只需按如下方式定义一个数据源(不指定数据库):

datasources = {
    datasource(name: 'my_schemas') {
        domainClasses([Question, Answer, Genre])
        driverClassName('com.mysql.jdbc.Driver')
        url('jdbc:mysql://test.myserver.com')
        username('***')
        password('***')
    }
}

然后我在我的域类的映射部分中指定数据库:

class Question {
    String text
    Answer answer
    Genre genre

    static mapping = {
        table 'my_schema_1.question'
    }
}

class Answer {
    String text

    static mapping = {
        table 'my_schema_1.answer'
    }
}

class Genre {
    String name

    static mapping = {
        table 'my_schema_2.genre'
    }
}

同样,这只能起作用,因为2个数据库位于同一台服务器上,并且它们使用相同的用户名/密码。