在Grails中,如何获取特定类使用的数据源的引用?

时间:2016-08-26 20:12:44

标签: grails gorm datasource

在我正在研究的项目中(在Grails 2.5.4 / Hibernate 4.3中)我有一堆不同的类,使用了一些不同的dataSource。我需要确定两个给定的Class对象是否使用相同的dataSource。我想做的是:

Boolean doDataSourcesMatch(Class a, Class b)
{
  return a.mapping.datasource == b.mapping.datasource
}

但当然这不起作用,因为a.mapping是一个闭包。有谁知道如何访问类使用的dataSource?我不需要知道连接的任何属性,只需要知道两个类的查询是否会使用相同的连接。

非常感谢!

1 个答案:

答案 0 :(得分:1)

虽然这些都没有具体说明,但它们可能有所帮助:

  1. http://grails.1312388.n4.nabble.com/How-can-I-get-the-column-name-that-a-property-maps-to-for-a-domain-class-td4633766.html

  2. How to get the name of the table GORM object is mapped to?

  3. 我还没有找到具体的东西,但这一切都很奇怪。我的意思是你已经知道了,我认为这是一些动态查询,否则你编码会知道要一起查询等等。

    无论如何作为一种解决方法,不确定它是否可以,因为它取决于我们正在谈论多少个domainClasses,以及这是否已经存在或者正在考虑写入,即如果可以的话,在任何一种情况下都没有写入将您自己的getter添加到所有相关的域类

    //
    static String getDataSrc() {
      return 'data_source_a'
    }
    
    //or
    static boolean canQuery() {
      return true/false
    }
    

    你可以从任何地方检查:

    boolean canQuery = UserAttributes.canQuery()
    String currentDataSource = UserAttributes.dataSrc
    

    由于它们是静态方法,因此不需要实例化。这意味着如果你有

    userObject(1)您不需要这样做:

    User user = User.get(1)
    if (user.canQuery()) {
     // this is ok
    } 
    

    您可以直接从任意位置调出方法通过引用upperCase类名及其方法。

    String currentDataSource = UserAttributes.dataSrc
    //Where this is exactly the same as above
    String currentDataSource = UserAttributes.getDataSrc()
    

    E2A:答案是:

    import org.grails.orm.hibernate.cfg.GrailsDomainBinder
    
    class TestController {
     //either this method
    def binder = new org.grails.orm.hibernate.cfg.GrailsDomainBinder().getMapping(Photos.class)
            println "binder : ${binder.table.name}"
            println "b: ${binder.datasources}"
    
    //Or this
            def dc=GrailsDomainBinder.getMapping(Photos.class)
    
            println "-dc is ${dc}"
            println "${dc.datasources}"
    }
    
      

    dc.datasources

    是一个列表,因此您需要比较列表。

    当然傻了,如果你在HQL中查询类似于动态表名的内容$ {tableA} $ {tableB}

    您需要访问实际的域类才能调用GrailsDomainBinder

    So something likedef domainClass = grailsApplication.getDomainClass(domain).clazz

    会为您提供给定tableName的实际domainClass。但是您的域名必须是完全合格的打包名称,这样才会再次出现问题。 如果您查询com.domain.users.tableAcom.domain.info.tableB

    所以你可以改为使用If of service / controller):

    def domainClass=Holders.grailsApplication?.domainClasses?.find { it.clazz.simpleName == tableName }?.clazz
    
    如果您在控制器服务中声明grailsApplication,则

    或没有Holders:

    def domainClass=grailsApplication?.domainClasses?.find { it.clazz.simpleName == tableName }?.clazz