grails 限制表创建 [英] grails limited table creation

查看:15
本文介绍了grails 限制表创建的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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.

有没有办法限制由 Grails 管理的表,或者它是全有或全无的提议?

Is there a way to limit the tables managed by Grails or is it an all or nothing proposition?

推荐答案

一般来说,Grails 使用 Hibernate 的 HBM2DDL 功能,所以要么全有要么全无.但是您可以使用自定义配置子类拦截该过程.这是一个扩展 GrailsAnnotationConfiguration 并覆盖所有三个 SQL 生成方法的示例:

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<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 don't need to override all three, e.g. you could let creates go through but remove updates.

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

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

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

请注意,该类必须用 Java 编写,因为基类中的私有方法与 Groovy 添加到所有 groovy 类的方法存在冲突.

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.

这篇关于grails 限制表创建的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆