Is it possible to map a table name for a domain object dynamically in grails?

后端 未结 2 704
北海茫月
北海茫月 2020-12-15 13:37

I have a domain that looks something like

class Foo {

  String name

  static mapping = {
     table \'foo\'    
  }
}

but I want to make

相关标签:
2条回答
  • 2020-12-15 14:11

    It is possible. You can add a Hibernate interceptor to process all SQL statements and parse/replace some token in the table name you enter in the mapping with the actual table name you want to use.

    src/groovy/DynamicTableNameInterceptor.groovy :

    import org.hibernate.EmptyInterceptor
    
    public class DynamicTableNameInterceptor extends EmptyInterceptor {
    
        public String onPrepareStatement(String sql) {
             // some kind of replacement logic here
             def schema=SomeHelperClass.resolveSchema()
             return sql.replaceAll('_SCHEMA_', schema) 
        }
    
    }
    

    grails-app/conf/spring/resources.groovy:

    beans = {
        // This is for Grails 1.3.x , in previous versions, the bean name is eventTriggeringInterceptor
        entityInterceptor(DynamicTableNameInterceptor)
    }
    
    0 讨论(0)
  • 2020-12-15 14:17

    I don't think that's possible. Upon application startup, the mapping closure is evaluated and Hibernate mapping are generated as a result. This happens once upon startup, so dynamic resolution will not occur.

    Something comparable is done in the multi-tenant-core plugin, using the 'single tenant' setup, you have a seperate database for each tenant.

    0 讨论(0)
提交回复
热议问题