我想使用Grails功能在有限的基础上创建/更新数据库表.具体来说,我希望Grails管理一些表,但不是全部.
有没有办法限制Grails管理的表格,还是一个全有或全无的命题?
Bur*_*ith 11
一般来说,自从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()]);
}
}
Run Code Online (Sandbox Code Playgroud)
您不需要覆盖所有三个,例如,您可以让创建通过但删除更新.
这在grails-app/conf/DataSource.groovy中注册:
dataSource {
pooled = true
driverClassName = ...
username = ...
password = ...
configClass = com.yourcompany.yourapp.MyConfiguration
}
Run Code Online (Sandbox Code Playgroud)
请注意,该类必须用Java编写,因为基类中的私有方法与Groovy添加到所有groovy类的方法冲突.