跨两个数据源的Grails GORM域关联

标签 grails datasource gorm relationship

如果另一个域类使用不同的数据源,是否可以在两个域类(即belongsTo)之间建立关联?这两个数据源也是不同的数据库驱动程序。

我怀疑这可能无法实现,但我想与这里的社区联系,看看是否可行。现在,我正在尝试执行此操作,并且遇到了通常的可疑Hibernate错误:
Invocation of init method failed; nested exception is org.hibernate.MappingException: An association from the table domain_class_A refers to an unmapped class: DomainClassB
样本:

class DomainClassA {
    static belongsTo = [dcB: DomainClassB]

    static mapping = {
        datasource "ds1"
        table name: "domain_class_A", schema: "schema_A"
    }
}

class DomainClassB {
    static hasMany = [dcA: DomainClassA]

    static mapping = {
        datasource "ds2"
        table name: "domain_class_B", schema: "schema_B"
    }
}

最佳答案

正如@dmahapatro在他的评论中指出的那样,这类似于1元素的情况,并且创建自己的方法来管理关系是必须的。这也与我前段时间关于映射集合的性能问题的演讲有关,因此您可以用一块石头杀死两只鸟:http://www.infoq.com/presentations/GORM-Performance

如果您不需要集合,即仅使用它来添加子对象的新实例,那么这将起作用,因为get实例的DomainClassB调用将使用其数据源:

class DomainClassA {
   Long domainClassBId
   private DomainClassB dcB

   DomainClassB getDomainClassB() {
      if (!dcB && domainClassBId) {
         dcB = DomainClassB.get(domainClassBId)
      }
      dcB
   }

   void setDomainClassB(DomainClassB dc) {
      domainClassBId = dc.id
   }

   static transients = ['domainClassB']

   static mapping = {
      datasource "ds1"
      table name: "domain_class_A", schema: "schema_A"
   }
}

class DomainClassB {

    static mapping = {
        datasource "ds2"
        table name: "domain_class_B", schema: "schema_B"
    }
}

创建一个新的DomainClassA实例与传统的addTo...方法有点不同,但是还算不错:
DomainClassB dcb = ...
def dca = new DomainClassA(domainClassBId: dcb.id)
dca.save()

如果您确实想访问DomainClassA的所有DomainClassB实例,则可以为此添加一个方法:
Set getDomainClassAs() {
   DomainClassA.findAllByDomainClassBId(id)
}

但是由于您自己进行查询,因此如果只需要一些实例,则不必加载所有实例,因此您可以执行所需的任何查询。

关于跨两个数据源的Grails GORM域关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18768667/

相关文章:

java - 如何将庞大的JSON对象转换为Java类对象

grails - 如何在Grails中模拟域名但由其父级获取?

Grails 中的 SQL 连接

grails - 仅在Grails应用程序GORM中具有外键,而在数据库中则没有

grails - 如何在grails域中创建自定义查询

grails - Grails:尝试使用Oracle 11g XE进行配置时出错

c# - Xtra报告 : An object assigned to the DataSource property cannot be used

java - Spring Boot autoconfig 仍在使用 Tomcat 数据源而不是 HikariCP?

java - Wildfly 配置 - 启动时出现奇怪的错误

grails - 我可以确定何时添加域类吗?