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

Tho*_*our 9 grails datasource grails-orm 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"
    }
}
Run Code Online (Sandbox Code Playgroud)

Bur*_*ith 8

正如@dmahapatro在他的评论中指出的那样,这与1元素的情况类似,并且创建自己的方法来管理关系是要走的路.这也与我之前关于映射集合的性能问题的讨论有关,因此你可以一举两得:http://www.infoq.com/presentations/GORM-Performance

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

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"
    }
}
Run Code Online (Sandbox Code Playgroud)

创建一个新的DomainClassA实例与传统addTo...方法有点不同,但它并不太糟糕:

DomainClassB dcb = ...
def dca = new DomainClassA(domainClassBId: dcb.id)
dca.save()
Run Code Online (Sandbox Code Playgroud)

如果您确实想要访问a的所有DomainClassA实例DomainClassB,可以为其添加一个方法:

Set getDomainClassAs() {
   DomainClassA.findAllByDomainClassBId(id)
}
Run Code Online (Sandbox Code Playgroud)

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