In general, this is all or nothing, as Grails uses the Hibernate HBM2DDL functionality. But you can intercept the process using a special configuration subclass. Here is 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<String> pruned = new ArrayList<String>(); 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 do not need to redefine all three, for example. You can allow the creation but removal of updates.
This is logged in grails-app / conf / DataSource.groovy:
dataSource { pooled = true driverClassName = ... username = ... password = ... configClass = com.yourcompany.yourapp.MyConfiguration }
Note that the class must be written in Java due to a problem with private methods in the base class, when faced with methods that Groovy adds to all Groovy classes.
source share