Duvida Hibernate

2 respostas
fabiel

Daew pessoal estou com uma duvida aqui com o hibernate, eh a seguinte:
Tenho um classe pessoa, uma classe aluno que extende pessoa e um classe curso.
Um curso tem N alunos.

Na minha classe Curso tenho um Set de alunos, quando busco o objeto curso do bd ele vem blz, agora quando
no resultado do bd faço curso.getAlunos() o hibernate tenta realizar um join, que eh o certo contudo em vez de o join ser
feito na tbAluno o hibernate esta usando a tbPessoa que eh o pai.
Quero saber qual a maneira de corrigir isso.

pessoa
public class Pessoa implements Serializable {

	private static final long serialVersionUID = 0L;

	private int id;
	private String nome;
	private char tpPessoa;

        // get's and set's
}
public class Aluno extends Pessoa{

	private static final long serialVersionUID = 1L;

	private String email;
	private Curso curso;

         // get's and set's
}
public class Curso implements Serializable{

	private static final long serialVersionUID = 1L;
	
	private int id;
	private String nome;
	
	private Set<Aluno> alunos;

        // get's and set's
}
Pessoa.hbm
<class name="entidades.Pessoa" table="tbPessoa">
		<id name="id" column="idPessoa">
			<generator class="sequence">
				<param name="sequence">genPessoa</param>
			</generator>
		</id>
		<!-- campo que identificara o tipo de guia armazenado nesta tabela 
			 F = Fisica
			 J = Juridica
		-->
		<discriminator column="tpPessoa" not-null="true" length="1"/>

		<property name="nome" column="nome" not-null="true" length="20"/>
		
	</class>
Aluno.hbm
<subclass name="entidades.Aluno" extends="entidades.Pessoa" discriminator-value="F">
		<join table="tbAluno">
			<key column="idPessoa" not-null="true" on-delete="cascade"
				unique="true" />

			<property name="email" column="email" />
			
			<many-to-one name="curso" column="idCurso" class="entidades.Curso"/>
		</join>
	</subclass>
Curso.hbml
<class name="entidades.Curso" table="tbCurso">
		<id column="idCurso" name="id" type="integer">
			<generator class="sequence">
				<param name="sequence">genCurso</param>
			</generator>
		</id>
		
		<property name="nome" column="nome" type="string" length="20"/>
		
		<set name="alunos" inverse="true" cascade="delete" order-by="nome">
			<key column="idCurso" not-null="true" />
  			<one-to-many class="entidades.Aluno"/>
		</set>
	</class>
Classe main
FabricaSessoesHibernate.getInstancia().carregueFabricasHibernate();
			CursoDAO dao = new CursoDAO();
			dao.inicieTransacao();
			
			Curso c = (Curso) dao.getObjeto(Curso.class, 1);
			System.out.println(c.getAlunos().toString());
			
			dao.termineTransacao(false);

Erro:


Hibernate: select curso0_.idCurso as idCurso1_0_, curso0_.nome as nome1_0_ from tbCurso curso0_ where curso0_.idCurso=?
Hibernate: select alunos0_.idCurso as idCurso1_, alunos0_.idPessoa as idPessoa1_, alunos0_.idPessoa as idPessoa0_0_, alunos0_.nome as nome0_0_, alunos0_1_.email as email2_0_, alunos0_1_.idCurso as idCurso2_0_ from tbPessoa alunos0_ inner join tbAluno alunos0_1_ on alunos0_.idPessoa=alunos0_1_.idPessoa where alunos0_.idCurso=? order by alunos0_.nome
org.hibernate.exception.GenericJDBCException: could not initialize a collection: [entidades.Curso.alunos#1]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.loadCollection(Loader.java:1926)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:520)
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1676)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
at org.hibernate.collection.PersistentSet.toString(PersistentSet.java:253)
at Teste.main(Teste.java:15)
Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. Dynamic SQL Error
SQL error code = -206
Column unknown
ALUNOS0_.IDCURSO
At line 1, column 308.
at org.firebirdsql.jdbc.FBPreparedStatement.(FBPreparedStatement.java:76)
at org.firebirdsql.jdbc.FBConnection.prepareStatement(FBConnection.java:223)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:442)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:368)
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:105)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1561)
at org.hibernate.loader.Loader.doQuery(Loader.java:661)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.loadCollection(Loader.java:1919)
... 8 more

2 Respostas

josue_carrecon

ueh [entidades.Curso.alunos#1] , o hibernate não tah achando isso, cara

fabiel

Então josue carrecon esta eh a minha duvida, pois o hibernate nao esta fazendo o sql com aluno.idCurso e
sim com pessoa.idCurso e nesta tabela nao existe este campo

Criado 11 de setembro de 2008
Ultima resposta 11 de set. de 2008
Respostas 2
Participantes 2