java - Grails - 创建数据库 View

标签 java mysql hibernate grails grails-orm

我正在使用 Grails 2.4.4(hibernate4 和 MySQL),我正在尝试创建一个数据库 View 以查看来自不同表的数据。

我关注了这个页面:http://www.slideshare.net/gr8conf/gorm-burt-beckwith2011

问题是 Gorm 正在创建表而不是 View 。此外,它创建的表仅包含列 ID。

我已经定义了下一个文件:

DataSource.groovy

dataSource {
    pooled = true
    jmxExport = true
    driverClassName = "com.mysql.jdbc.Driver"
    username = "--"
    password = "--"
    configClass = gr8conf.DdlFilterConfiguration <--
}

gr8conf.DdlFilterConfiguration

 package gr8conf;

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 [] IGNORED_NAMES = {"v_convocatorias"};

     @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)||
                command.startsWith("drop table if exists " + table)) {

                return true;
            }
        }
        return false;
    }
}

hibernate/hibernate.cfg.xml

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    <session-factory>
        <mapping resource='misc.mysql.innodb.hbm.xml' />
    </session-factory>
</hibernate-configuration>

hibernate/misc.mysql.innodb.hbm.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mappin DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <database-object>
        <create>
            CREATE OR REPLACE VIEW v_convocatorias AS
                SELECT c.titulo, c.descripcion, d.nombre nombre_departamento
                FROM convocatoria c, departamento d
                WHERE d.id = c.departamento_id
        </create>

        <drop>DROP VIEW IF EXISTS v_convocatorias</drop>

        <dialect-scope
            name='org.hibernate.dialect.MySQLInnoDBDialect' />

    </database-object>
</hibernate-mapping>

以及应该从 View 中获取信息的域类:

Convocatorias

class Convocatorias {

    def titulo
    def descripcion
    def nombreDepartamento

    static mapping = {
        table 'v_convocatorias'
        version false
        titulo column:'titulo'
        descripcion column:'descripcion'
        nombreDepartamento column:'nombre_departamento'
    }
}

最佳答案

最后,我无法直接使用 Hibernate 映射。 所以我找到了另一种方法,使用迁移插件: http://grails.org/plugin/database-migration

它允许您在创建后更改数据库。

更多信息: http://www.javacodegeeks.com/2014/01/using-database-views-in-grails.html

关于java - Grails - 创建数据库 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28110473/

相关文章:

php - 比较不同领域的日期和时间

javascript - 如何调用 php 函数以使用 jQuery 从 MYSQL 获取更新的数据

java - 与 Graphics2d、 Canvas 和形状混淆

java - Android 程序中 onCreate() 中的 NullPointerException

java - 如何获取文件的 base64?

java - 如何将值传递给 BitSet 类并创建包含 BitSet 值的列表?

php - 外部约束失败

java - hibernate 缩小延迟加载集合范围

java - Hibernate映射与DB触发器+序列生成的ID

sql-server - 指定备用数据源后,grails 为嵌入式 h2 抛出 sql 异常