gpt4 book ai didi

grails - 在Grails中映射旧数据库表时避免表更改?

转载 作者:行者123 更新时间:2023-12-02 14:16:02 25 4
gpt4 key购买 nike

我有一个应用程序,其中包含一些从Grails域类自动生成的表,以及一个旧表(例如表legacy),这些旧表是在Grails外部创建的,但正由Grails域类映射。映射旧数据库中的列很简单,但是我想禁用添加额外的字段和索引,这些额外的字段和索引是Grails为该表尝试处理的。

我的问题是:如何指示Grails不要对legacy表进行任何表更改(如添加索引,外键,版本列等更改)?

请注意,我不想仅针对映射表legacy禁用所有表的自动模式生成/更新。

最佳答案

我能够做这样的事情的唯一方法是自定义Configuration类:

package com.foo.bar;

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.dialect.HSQLDialect;
import org.hibernate.tool.hbm2ddl.DatabaseMetadata;

public class DdlFilterConfiguration extends GrailsAnnotationConfiguration {

private static final String[] IGNORE_NAMES = { "legacy" };

@Override
public String[] generateSchemaCreationScript(Dialect dialect) throws HibernateException {
return prune(super.generateSchemaCreationScript(dialect), dialect);
}

@Override
public String[] generateDropSchemaScript(Dialect dialect) throws HibernateException {
return prune(super.generateDropSchemaScript(dialect), dialect);
}

@Override
public String[] generateSchemaUpdateScript(Dialect dialect, DatabaseMetadata databaseMetadata) throws HibernateException {
return prune(super.generateSchemaUpdateScript(dialect, databaseMetadata), dialect);
}

private String[] prune(String[] script, Dialect dialect) {
if (dialect instanceof HSQLDialect) {
// do nothing for test env
return script;
}

List<String> pruned = new ArrayList<String>();
for (String command : script) {
if (!isIgnored(command)) {
pruned.add(command);
}
}

return pruned.toArray(new String[pruned.size()]);
}

private boolean isIgnored(String command) {
command = command.toLowerCase();
for (String table : IGNORED_NAMES) {
if (command.startsWith("create table " + table + " ") ||
command.startsWith("alter table " + table + " ") ||
command.startsWith("drop table " + table + " ")) {
return true;
}
}
return false;
}
}

将其放在src / java中(由于奇怪的编译错误而无法用Groovy编写),并使用'configClass'属性在DataSource.groovy中进行注册:
dataSource {
pooled = true
driverClassName = ...
username = ...
password = ...
dialect = ...
configClass = com.foo.bar.DdlFilterConfiguration
}

关于grails - 在Grails中映射旧数据库表时避免表更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1983117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com