Grails - Problema no Mapeamento de Herança

2 respostas
sergiomarcio2001

Bom dia pessoal,

Sou novo no grails, e estou tentando usar herança com mapeamento!
Já postei na lista de discussoes do grails, e inclusive a nova versao, 1.0.2, diz que o problema foi consertado! Porém continuo tendo problemas!
Gostaria de ajuda de voces!

Tenhas as seguintes classes:

Classe-mãe:
class Tarefa {

String descricao
Date inicio
Date fim
Date inclusao
Cidade cidade
Regiao regiao
Pais pais

//restrições

static constraints = {

descricao(blank:false)

inicio(nullable:false)

fim(nullable:false)

cidade(nullable:false)

regiao(nullable:false)

pais(nullable:false)

}
static mapping = {

tablePerHierarchy(false)

table(tbtarefa)

version(false)

id(generator:increment)

columns {

id(column:idtarefa)

inicio(column:dhtarefainicio)

fim(column:dhtarefafim)

descricao(column:dstarefa)

inclusao(column:dhinclusao)

cidade(column:idcidade)

regiao(column:idregiao)

pais(column:idpais)

}

}

String toString() {"${this.descricao}"}

}

Classe-filha:

class TarefaEvento extends Tarefa{

//atributos da classe
boolean newsletter
TipoParticipaEvento tpParticipacaoEmbratur
TipoParticipaEvento tpParticipacaoConsultor
int totalParticipante
int totalTrade
int totalPublicoFinal
String localEvento
String comentario
   
//relacionamento many-to-many com Organizador e Parceiro
static hasMany = [organizadores:Organizador,parceiros:Parceiro]

//restrições
static constraints = {
	newsletter()
	tpParticipacaoEmbratur(nullable:false)
	tpParticipacaoConsultor(nullable:false)
	totalParticipante(blank:false)
	localEvento(maxSize:80, blank:false)
	comentario(blank:true)
	totalTrade(blank:false)
	totalPublicoFinal()
	organizadores()
	parceiros()
}

//relacionamento com o banco de dados
static mapping = {
	table('tbtarefaevento')
	version(false)
	id(generator:'increment')
	columns {
		id(column:'idtarefa')
		tpParticipacaoEmbratur(column:'tpparticipacaoembratur')
		tpParticipacaoConsultor(column:'tpparticipacaoconsultor')
		totalParticipante(column:'toparticipantes')
		totalTrade(column:'nrtrades')
		totalPublicoFinal(column:'topublicofinal')
		newsletter(column:'innewsletter')
		localEvento(column:'nmlocal')
		comentario(column:'txcomentario')
		organizadores(column:'idorganizador', joinTable:'tborganizadorevento')
		parceiros(column:'idparceiro', joinTable:'tbparceiroevento')
	}
}

}

Nesse meu caso tenho que a classe TarefaEvento é uma especializaçào de tarefa.

Meu problema ocorre quando tenho que criar um novo cadastro de TarefaEvento. Ocorre problema no id, que nesse caso está mapeado para a tabela.

Verifique as messagens de erro;

org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query

at C__WorkCVS_Embratur_TBINovo_Implementacao_TBI_grails_app_views_tarefaEvento_create_gsp$_run_closure2.doCall(C__WorkCVS_Embratur_TBINovo_Implementacao_TBI_grails_app_views_tarefaEvento_create_gsp:76)

  at C__WorkCVS_Embratur_TBINovo_Implementacao_TBI_grails_app_views_tarefaEvento_create_gsp$_run_closure2.doCall(C__WorkCVS_Embratur_TBINovo_Implementacao_TBI_grails_app_views_tarefaEvento_create_gsp)

  at C__WorkCVS_Embratur_TBINovo_Implementacao_TBI_grails_app_views_tarefaEvento_create_gsp.run(C__WorkCVS_Embratur_TBINovo_Implementacao_TBI_grails_app_views_tarefaEvento_create_gsp:116)

Caused by: org.hibernate.exception.SQLGrammarException: could not execute query

... 3 more

Caused by: org.postgresql.util.PSQLException: ERROR: column this_.id does not exist

at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)

  at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)

  at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)

  at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)

  at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)

  at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)

  at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:92)

  ... 3 more

Gostaria de uma ajuda entao para saber se estou usando corretamente esse mecanismo de heranca ou seria um bug msm!
Alguem que ja tenha passado por essa situacao poderia me ajudar.

Me ajudem, pode modificar a classe caso esteja errada, verifique o mapeamento como é feito !

Já olhei em documentacao muito sobre isso! Mas ainda está dificil!

Tb mostro abaixo os meus scripts no banco de dados das tabelas, que nesse caso uso postgres;

CREATE TABLE tbtarefa

(

idtarefa integer NOT NULL,

dstarefa character varying(500),

dhtarefainicio date,

dhtarefafim date,

dhinclusao date,

idtarefasup integer,

idprofissional integer,

idcidade integer,

idregiao integer,

idpais integer,

txcomentarioremarca text,

txcometariocancela text,

CONSTRAINT pk_tbtarefa PRIMARY KEY (idtarefa)

)

WITH (OIDS=FALSE);

ALTER TABLE tbtarefa OWNER TO postgres;
CREATE TABLE tbtarefaevento

(

idtarefa integer NOT NULL,

tpparticipacaoembratur character(3),

tpparticipacaoconsultor character(3),

toparticipantes numeric(6),

nmlocal character varying(80),

txcomentario text,

nrtrades numeric(6),

topublicofinal numeric(6),

innewsletter character(1),

CONSTRAINT pk_tbtarefaevento PRIMARY KEY (idtarefa)

)

WITH (OIDS=FALSE);

ALTER TABLE tbtarefaevento OWNER TO postgres;

Aguardo resposta pessoal! Preciso muito disso que estou em situacao de urgencia no projeto !

Muito obrigado!
Sergio Teixeira.
Belo Horizonte - MG.

2 Respostas

Javabuntu

cara edita teu código ai e posta dentro da tag Code… ta dificil de ler seu codigo.

sergiomarcio2001

Tranquilo, segue abaixo novamente!

Classe mãe:

class Tarefa {

  String descricao
  Date inicio
  Date fim
  Date inclusao
  Cidade cidade
  Regiao regiao
  Pais pais
  
  //restrições
  static constraints = {
	  descricao(blank:false)
	  inicio(nullable:false)
	  fim(nullable:false)
	  cidade(nullable:false)
	  regiao(nullable:false)
	  pais(nullable:false)
  }
  
  static mapping = {
	tablePerHierarchy(false)
    table('tbtarefa')
    version(false)
    id(generator:'increment')
    columns {
		id(column:'idtarefa')
		inicio(column:'dhtarefainicio')
		fim(column:'dhtarefafim')
		descricao(column:'dstarefa')
		inclusao(column:'dhinclusao')
		cidade(column:'idcidade')
		regiao(column:'idregiao')
		pais(column:'idpais')
	}
  }
  
  String toString() {"${this.descricao}"}

}

Classe-filha:

class TarefaEvento extends Tarefa{
	
	//atributos da classe
	boolean newsletter
	TipoParticipaEvento tpParticipacaoEmbratur
	TipoParticipaEvento tpParticipacaoConsultor
	int totalParticipante
	int totalTrade
	int totalPublicoFinal
	String localEvento
	String comentario
	   
	//relacionamento many-to-many com Organizador e Parceiro
	static hasMany = [organizadores:Organizador,parceiros:Parceiro]
	
	//restrições
	static constraints = {
		newsletter()
		tpParticipacaoEmbratur(nullable:false)
		tpParticipacaoConsultor(nullable:false)
		totalParticipante(blank:false)
		localEvento(maxSize:80, blank:false)
		comentario(blank:true)
		totalTrade(blank:false)
		totalPublicoFinal()
		organizadores()
		parceiros()
	}
	
	//relacionamento com o banco de dados
	static mapping = {
		table('tbtarefaevento')
		version(false)
		id(generator:'increment')
		columns {
			id(column:'idtarefa')
			tpParticipacaoEmbratur(column:'tpparticipacaoembratur')
			tpParticipacaoConsultor(column:'tpparticipacaoconsultor')
			totalParticipante(column:'toparticipantes')
			totalTrade(column:'nrtrades')
			totalPublicoFinal(column:'topublicofinal')
			newsletter(column:'innewsletter')
			localEvento(column:'nmlocal')
			comentario(column:'txcomentario')
			organizadores(column:'idorganizador', joinTable:'tborganizadorevento')
			parceiros(column:'idparceiro', joinTable:'tbparceiroevento')
		}
	}
	
}

Obrigado!
Sérgio Teixeira.

Criado 24 de março de 2008
Ultima resposta 24 de mar. de 2008
Respostas 2
Participantes 2