В целом это все или ничего, поскольку Grails использует функциональность Hibernate HBM2DDL. Но вы можете перехватить процесс, используя пользовательский подкласс конфигурации. Вот пример, который расширяет GrailsAnnotationConfiguration и переопределяет все три метода генерации SQL:
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()]);
}
}
Вам не нужно переопределять все три, например, Вы можете разрешить создавать, но удалять обновления.
Это регистрируется в grails-app / conf / DataSource.groovy:
dataSource {
pooled = true
driverClassName = ...
username = ...
password = ...
configClass = com.yourcompany.yourapp.MyConfiguration
}
Обратите внимание, что класс должен быть написан на Java из-за проблемы с закрытыми методами в базовом классе, конфликтующими с методами, которые Groovy добавляет ко всем классам groovy.