grails limited table creation

后端 未结 2 1090
别跟我提以往
别跟我提以往 2021-01-06 06:34

I\'d like to use the Grails feature for creating/updating database tables on a limited basis. Specifically, I\'d like Grails to manage some tables, but not all.

Is

2条回答
  •  迷失自我
    2021-01-06 07:18

    In general it's all or nothing since Grails uses Hibernate's HBM2DDL functionality. But you can intercept the process using a custom configuration subclass. Here's an example that extends GrailsAnnotationConfiguration and overrides all three SQL generation methods:

    package com.yourcompany.yourapp;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsAnnotationConfiguration;
    import org.hibernate.HibernateException;
    import org.hibernate.dialect.Dialect;
    import org.hibernate.tool.hbm2ddl.DatabaseMetadata;
    
    public class MyConfiguration extends GrailsAnnotationConfiguration {
    
       private static final String[] IGNORE_NAMES = { "foo", "bar" };
    
       @Override
       public String[] generateDropSchemaScript(Dialect dialect) throws HibernateException {
          return prune(super.generateDropSchemaScript(dialect));
       }
    
       @Override
       public String[] generateSchemaCreationScript(Dialect dialect) throws HibernateException {
          return prune(super.generateSchemaCreationScript(dialect));
       }
    
       @Override
       public String[] generateSchemaUpdateScript(Dialect dialect, DatabaseMetadata databaseMetadata)
             throws HibernateException {
          return prune(super.generateSchemaUpdateScript(dialect, databaseMetadata));
       }
    
       private String[] prune(String[] script) {
          List pruned = new ArrayList();
          for (String command : script) {
             for (String ignoreName : IGNORE_NAMES) {
                if (!command.toLowerCase().contains(" table " + ignoreName + " ")) {
                   pruned.add(command);
                }
             }
          }
          return pruned.toArray(new String[pruned.size()]);
       }
    }
    

    You don't need to override all three, e.g. you could let creates go through but remove updates.

    This gets registered in grails-app/conf/DataSource.groovy:

    dataSource {
       pooled = true
       driverClassName = ...
       username = ...
       password = ...
       configClass = com.yourcompany.yourapp.MyConfiguration
    }
    

    Note that the class has to be written in Java because of an issue with private methods in the base class clashing with methods that Groovy adds to all groovy classes.

提交回复
热议问题