[英]Grails - Create database view
我對Grails 2.4.4(hibernate4和MySQL)感到不安,並且試圖創建數據庫視圖以查看來自不同表的數據。
我關注了此頁面: http : //www.slideshare.net/gr8conf/gorm-burt-beckwith2011
問題是Gorm正在創建表而不是視圖。 此外,它僅使用列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>
休眠/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>
以及應該從視圖中獲取信息的域類:
肉食者
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'
}
}
最后,我couldn't直接與Hibernate映射做到這一點。 所以我找到了另一種方式,使用migration plugin
: http : //grails.org/plugin/database-migration
它允許您在創建數據庫后更改數據庫。
更多信息: http : //www.javacodegeeks.com/2014/01/using-database-views-in-grails.html
如果GORM創建視圖而不是表,則DdlFilterConfiguration不起作用。 您制作DdlFilterConfiguration.groovy而不是DdlFilterConfiguration.java的原因
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.