Hibernate

Olá Pessoal!
Estou desenvolvendo no meu TCC um projeto para alocação de professores. Não estava utilizando Hibernate, mas na prévia do TCC, me obrigaram a usar o Hibernate. Bom, tendo problemas para usar o many-to-one para seguinte situação:

Um professor tem uma titulação (pós, mestre, doutor etc…) e titulação pode ter vários professores.
Segue abaixo as duas classes.

package bean;
import bean.Titulacao;
public class Professor {
private int pfr_id;
private String pfr_matricula;
private String pfr_nome;
private Titulacao ttl_id;

public int getPfr_id() {
	return pfr_id;
}
public void setPfr_id(int pfr_id) {
	this.pfr_id = pfr_id;
}
public String getPfr_matricula() {
	return pfr_matricula;
}
public void setPfr_matricula(String pfr_matricula) {
	this.pfr_matricula = pfr_matricula;
}
public String getPfr_nome() {
	return pfr_nome;
}
public void setPfr_nome(String pfr_nome) {
	this.pfr_nome = pfr_nome;
}
public Titulacao getTtl_id() {
	return ttl_id;
}
public void setTtl_id(Titulacao ttl_id) {
	this.ttl_id = ttl_id;
}

}
package bean;

public class Titulacao {
private int ttl_id;
private String ttl_descricao;
private int ttl_pontos;

public String getTtl_descricao() {
	return ttl_descricao;
}
public void setTtl_descricao(String ttl_descricao) {
	this.ttl_descricao = ttl_descricao;
}
public int getTtl_id() {
	return ttl_id;
}
public void setTtl_id(int ttl_id) {
	this.ttl_id = ttl_id;
}
public int getTtl_pontos() {
	return ttl_pontos;
}
public void setTtl_pontos(int ttl_pontos) {
	this.ttl_pontos = ttl_pontos;
}

}

No Hibernate o mapeamento ficou assim:

Professor:

<class name="Professor" table="professor">

	<!-- Identificador da classe -->
	<id name="pfr_id">
		<generator class="increment"/>
	</id>

	<!-- Propriedades da classe -->
	<property name="pfr_matricula"/>
	<property name="pfr_nome"/> 
	<many-to-one name="ttl_id" class="Titulacao" column="ttl_id"/> 
</class>

Titulacao:

<class name="Titulacao" table="titulacao">

	<!-- Identificador da classe -->
	<id name="ttl_id">
		<generator class="increment"/>
	</id>

	<!-- Propriedades da classe -->
	<property name="ttl_descricao"/>
	<property name="ttl_pontos"/>    	   	

</class>

Ocorre que tenho um relatório (IReport) de Professores por Titulação. Fiz a seguinte query no ProfessorDAO:

public List getListaProfessoresPorTitulacao(int paramTitulacao) throws SistemaException {

	List<Professor> todosProfessores = new ArrayList();			
	
	try {				
		Session session = ConexaoHibernate.getSession();
		if (paramTitulacao != 0){
			Query select = session.createQuery("titulacao.ttl_id, titulacao.ttl_descricao, professor.pfr_matricula, professor.pfr_nome" +
					" from bean.Professor, bean.Titulacao" +
					" where ttl_id = :id" +
					" and titulacao.ttl_id = professor.ttl_id" +
					" order by titulacao.ttl_descricao, pfr_nome");
			select.setInteger("id",paramTitulacao);
			todosProfessores =  select.list();	 	
		}else {
			
			Query select = session.createQuery("titulacao.ttl_id, titulacao.ttl_descricao, professor.pfr_matricula, professor.pfr_nome" +
					" from bean.Professor, bean.Titulacao" +
					" where titulacao.ttl_id = professor.ttl_id" +
					" order by titulacao.ttl_descricao, pfr_nome");
			
			todosProfessores =  select.list();	
		}
								
		session.close();						
	} 
	catch (Exception ex){ 
		throw new SistemaException("ProfessorDao","getListaProfessor","Não foi possível buscar lista Professor Cadastrados no banco de dados.\n" + ex.getMessage(), "query");			
	}
	return todosProfessores;
}

Quando executo o método acima ele apresenta o seguinte erro:
09:47:57,281 ERROR PARSER:33 - line 1:1: unexpected token: titulacao
exception.SistemaException
at dao.ProfessorDao.getListaProfessoresPorTitulacao(ProfessorDao.java:136)
at bean.TesteJasper.main(TesteJasper.java:47)

Outra dúvida que tenho é como fazer um REQUEST do campo Titulacao, que é do tipo OBJETO, que está no FORM.PROFESSOR.JSP.
Antes de usar o Hibernate eu tinha o seguinte REQUEST:

int ttl_id = Integer.parseInt(request.getParameter("titulacao"));	

Na classe Professor.Java esta definido dessa forma:

private Titulacao ttl_id;

Mas agora, com o Hibernate, ttl_id é um Objeto e na classe Professor.java ficou assim:

private Titulacao ttl_id;

E agora não sei como tratar isso no request .

Toda ajuda é bem vinda.
Grato.
Maia.

Bem vindo.

Por favor edite seu tópico colocando a tag [ code] em volta dos trechos de código, assim ele ficará formatado :smiley:

Mas pelo que consegui pescar foi que falta declarar o alias “titulacao” no from:

Query select = session.createQuery("titulacao.ttl_id, titulacao.ttl_descricao, professor.pfr_matricula, professor.pfr_nome" + " from bean.Professor, bean.Titulacao titulacao" ...

Está faltando também o alias “professor”…

Query select = session.createQuery("titulacao.ttl_id, titulacao.ttl_descricao, professor.pfr_matricula, professor.pfr_nome" + " from bean.Professor professor, bean.Titulacao titulacao"

Flow

eae aki vai um exemplo do mapiamento many-to-one

&lt;class name="br.com.cast.aluno.integracao.VOCidade" table="cidade"&gt; &lt;id name="cod_cidade" column="COD_CIDADE"&gt; &lt;generator class="increment"/&gt; &lt;/id&gt; &lt;many-to-one name="sigla" class="br.com.cast.aluno.integracao.VOUf" column="SIGLA"/&gt; &lt;property name="descricao"/&gt; &lt;/class&gt;

acho que deve ser o empacotamento da classe.

bom to vendo rapido seu codigo vo dar um olha mais detalhada dai volto a posta

inte

[]s

Olá Pessoal!
Implementei o ALIÁS mas o erro persiste:

14:07:44,343 ERROR PARSER:33 - line 1:1: unexpected token: titulacao
exception.SistemaException
	at dao.ProfessorDao.getListaProfessoresPorTitulacao(ProfessorDao.java:136)
	at bean.TesteJasper.main(TesteJasper.java:47)

Ah, convém mencionar que estou utilizando MySQL 5.0 com tabelas MYISAM.

Pelo que vi no exemplo de mapeamento o Professor.hbm.xml está correto. Segue abaixo parte do ProfessorDAO.java:

	public List getListaProfessoresPorTitulacao(int paramTitulacao) throws SistemaException {

		List<Professor> todosProfessores = new ArrayList();			
		
		try {				
			Session session = ConexaoHibernate.getSession();
			if (paramTitulacao != 0){
				Query select = session.createQuery("titulacao.ttl_id, titulacao.ttl_descricao, professor.pfr_matricula, professor.pfr_nome" +
						" from bean.Professor professor, bean.Titulacao titulacao" +
						" where professor.ttl_id = :id" +
						" and titulacao.ttl_id = professor.ttl_id" +
						" order by titulacao.ttl_descricao, pfr_nome");
				select.setInteger("id",paramTitulacao);
				todosProfessores =  select.list();	 	
			}else {
				
				Query select = session.createQuery("titulacao.ttl_id, titulacao.ttl_descricao, professor.pfr_matricula, professor.pfr_nome" +
						" from bean.Professor professor, bean.Titulacao titulacao" +
						" where titulacao.ttl_id = professor.ttl_id" +
						" order by titulacao.ttl_descricao, pfr_nome");
				
				todosProfessores =  select.list();	
			}
									
			session.close();						
		} 
		catch (Exception ex){ 
			throw new SistemaException("ProfessorDao","getListaProfessor","Não foi possível buscar lista Professor Cadastrados no banco de dados.\n" + ex.getMessage(), "query");			
		}
		return todosProfessores;
	}


Abaixo está o Professor.java:

package bean;
import bean.Titulacao;
public class Professor {
	private int pfr_id;
	private String pfr_matricula; 
	private String pfr_nome;
	private Titulacao ttl_id;

	public int getPfr_id() {
		return pfr_id;
	}
	public void setPfr_id(int pfr_id) {
		this.pfr_id = pfr_id;
	}
	public String getPfr_matricula() {
		return pfr_matricula;
	}
	public void setPfr_matricula(String pfr_matricula) {
		this.pfr_matricula = pfr_matricula;
	}
	public String getPfr_nome() {
		return pfr_nome;
	}
	public void setPfr_nome(String pfr_nome) {
		this.pfr_nome = pfr_nome;
	}
	public Titulacao getTtl_id() {
		return ttl_id;
	}
	public void setTtl_id(Titulacao ttl_id) {
		this.ttl_id = ttl_id;
	}	
}

Professor.hbm.xml:

<hibernate-mapping package="bean">

	<class name="Professor" table="professor">
	
		<!-- Identificador da classe -->
    	<id name="pfr_id">
    		<generator class="increment"/>
    	</id>
 
    	<!-- Propriedades da classe -->
    	<property name="pfr_matricula"/>
    	<property name="pfr_nome"/> 
    	<many-to-one name="ttl_id" class="Titulacao" column="ttl_id"/> 
	</class>

Titulacao.java

package bean;

public class Titulacao {
	private int ttl_id;
	private String ttl_descricao;
	private int ttl_pontos;
	
	public String getTtl_descricao() {
		return ttl_descricao;
	}
	public void setTtl_descricao(String ttl_descricao) {
		this.ttl_descricao = ttl_descricao;
	}
	public int getTtl_id() {
		return ttl_id;
	}
	public void setTtl_id(int ttl_id) {
		this.ttl_id = ttl_id;
	}
	public int getTtl_pontos() {
		return ttl_pontos;
	}
	public void setTtl_pontos(int ttl_pontos) {
		this.ttl_pontos = ttl_pontos;
	}

}

Titulacacao.hbm.xml:

<hibernate-mapping package="bean">

	<class name="Titulacao" table="titulacao">
	
		<!-- Identificador da classe -->
    	<id name="ttl_id">
    		<generator class="increment"/>
    	</id>
  
    	<!-- Propriedades da classe -->
    	<property name="ttl_descricao"/>
    	<property name="ttl_pontos"/>    	   	
 
	</class>

Pessoal toda dica é bem vinda.
Obrigado.

Seu problema é que na hora que vc declara as classes no mapeamento vc não põe o empacotamento delas direito:

Segue um exemplo:

[code]

    <property name="pfr_matricula"/>   
    <property name="pfr_nome"/>   
    <many-to-one name="ttl_id" class="Titulacao" column="ttl_id"/>   
</class>  [/code]

Como sua classe está no pacote bean vc precisa mapeá-la corretamente:

[code]

    <property name="pfr_matricula"/>   
    <property name="pfr_nome"/>   
    <many-to-one name="ttl_id" class="bean.Titulacao" column="ttl_id"/>   
</class>  [/code]

Vê ae se dá certo, faça isso com o professor tb.

T+

Olá DiscipuloDoSplinter!
Fiz a alteração como sugerido por você mas não funcionou, deu erro:

15:01:33,875 ERROR PARSER:33 - line 1:1: unexpected token: titulacao
exception.SistemaException
	at dao.ProfessorDao.getListaProfessoresPorTitulacao(ProfessorDao.java:135)
	at bean.TesteJasper.main(TesteJasper.java:47)

Ao utilizar o

<hibernate-mapping package="bean">

Ele não teria que buscar todas as classes no bean?

Lembrando novamente: Professor só pode ter uma TITULACAO e titulação pode estar em vários PROFESSORES.
Já postei os HBM´s do Professor e da Titulação, o mapeamento que fiz está correto?

Grato.

Sim, está correto, se vc não quiser visualizar depois os professores de uma determinada titulação este mapeamento já está bom.

Com relação ao mapeamento do pacote eu não tinha visto esta linha, peço desculpas…
vou tentar verficar mais alguma coisa, espero achar o problema…

Com relação ao MySQL, utilizando tabelas MyISAM as quais ao criar referenciei a chave estrangeira, funciona no Hibernate?


CREATE TABLE `professor` (
  `pfr_id` int(11) NOT NULL auto_increment,
  `pfr_matricula` varchar(15) character set latin1 collate latin1_bin default NULL,
  `pfr_nome` varchar(50) character set latin1 collate latin1_bin default NULL,
  `ttl_id` int(11) default NULL,
  PRIMARY KEY  (`pfr_id`),
  KEY `professor_FKIndex1` (`ttl_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;


CREATE TABLE `titulacao` (
  `ttl_id` int(11) NOT NULL auto_increment,
  `ttl_descricao` varchar(50) character set latin1 collate latin1_bin default NULL,
  `ttl_pontos` int(5) default NULL,
  PRIMARY KEY  (`ttl_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


Olá Pessoal!
Como já mencionei anteriormente, estou iniciando trabalhos com o Hibernate. Até então não tinha feito QUERY com mais de uma tabela e selecionando campos específicos. O erro estava ocorrendo porque não coloquei o SELECT na query. O Hibernate suporta " from tabela…" então antes do “from” eu apenas coloquei os campos, mas não o SELECT. Ah, a dica referente ao ALIAS também foi válida, pois na primeira versão não tinha.

   1. public List getListaProfessoresPorTitulacao(int paramTitulacao) throws SistemaException {  
   2.   
   3.     List<Professor> todosProfessores = new ArrayList();             
   4.       
   5.     try {                 
   6.         Session session = ConexaoHibernate.getSession();  
   7.         if (paramTitulacao != 0){  
   8.             Query select = session.createQuery(" SELECT titulacao.ttl_id, titulacao.ttl_descricao, professor.pfr_matricula, professor.pfr_nome" +  
   9.                     " from bean.Professor professor, bean.Titulacao titulacao" +  
  10.                     " where professor.ttl_id = :id" +  
  11.                     " and titulacao.ttl_id = professor.ttl_id" +  
  12.                     " order by titulacao.ttl_descricao, pfr_nome");  
  13.             select.setInteger("id",paramTitulacao);  
  14.             todosProfessores =  select.list();        
  15.         }else {  
  16.               
  17.             Query select = session.createQuery("SELECT titulacao.ttl_id, titulacao.ttl_descricao, professor.pfr_matricula, professor.pfr_nome" +  
  18.                     " from bean.Professor professor, bean.Titulacao titulacao" +  
  19.                     " where titulacao.ttl_id = professor.ttl_id" +  
  20.                     " order by titulacao.ttl_descricao, pfr_nome");  
  21.               
  22.             todosProfessores =  select.list();    
  23.         }  
  24.                                   
  25.         session.close();                          
  26.     }   
  27.     catch (Exception ex){   
  28.         throw new SistemaException("ProfessorDao","getListaProfessor","Não foi possível buscar lista Professor Cadastrados no banco de dados.\n" + ex.getMessage(), "query");             
  29.     }  
  30.     return todosProfessores;  
  31. }  

Obrigado a todos que colaboraram.
Até.