grails限量表创建

时间:2010-10-14 15:53:21

标签: grails gorm

我想使用Grails功能在有限的基础上创建/更新数据库表。具体来说,我希望Grails管理一些表,但不是全部。

有没有办法限制Grails管理的表格,还是一个全有或全无的命题?

2 个答案:

答案 0 :(得分: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()]);
   }
}

您无需覆盖所有三个,例如你可以让创建通过,但删除更新。

这在grails-app / conf / DataSource.groovy中注册:

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

请注意,该类必须用Java编写,因为基类中的私有方法与Groovy添加到所有groovy类的方法发生冲突的问题。

答案 1 :(得分:2)

感谢Steve的修复。我正在重新发布上面的修复程序,但格式化为stackoverflow。当我第一次尝试这个时,我错过了原始if ( command.toLowerCase()...)将修复中的逻辑反转为if (command.toLowerCase()...)的事实,这有效地使其看起来像{{ 1}}在我的config / DataSource.groovy中没有任何效果。我甚至从这个页面的HTML源代码中查看了代码的预期换行符,但仍然错过了那个重要的逻辑:-(一旦我输入正确的代码,它就运行得很好。

dbCreate = "create-drop"