Criar tabelas usando Hibernate e sintaxe do List

Sou iniciante em Java e Hibernate.
Tenho o seguinte problema:

  1. Quero criar um endereço e vinculá-lo ao Aluno. O relacionamento de Aluno com Endereço é ManyToMany. Não sei como usar List.

  2. Quando tento criar as tabelas aparece o seguinte erro:

“Exception in thread “main” org.hibernate.AnnotationException: @OneToOne or @ManyToOne on br.com.quali.preparatorio.entidade.CursoDeIsoladas.coordenador references an unknown entity: br.com.quali.preparatorio.entidade.Coordenador
at org.hibernate.cfg.FkSecondPass.doSecondPass(FkSecondPass.java:56)
at org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:474)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:295)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1286)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:915)
at br.com.quali.preparatorio.repositorio.TesteHibernate.main(TesteHibernate.java:26)

[code]<?xml version="1.0" encoding="UTF-8" ?>

<session-factory>  
	<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
	<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
					
	<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/basededados</property>
	<property name="hibernate.connection.username">postgres</property>
	
	<property name="hibernate.connection.password">teste</property>
	<property name="show_sql">false</property>
	<property name="hibernate.generate_statistics">false</property>
	<property name="hibernate.use_sql_comments">false</property>
	<!-- property name="hibernate.hbm2ddl.auto">create-drop</property-->
                <property name="hibernate.hbm2ddl.auto">create</property>

	<mapping class="br.com.quali.banco.preparatorio.EntidadeBasica"/>

	<mapping class="br.com.quali.banco.preparatorio.Pessoa"/>
	<mapping class="br.com.quali.banco.preparatorio.Aluno"/>
	<mapping class="br.com.quali.banco.preparatorio.Professor"/>
	<mapping class="br.com.quali.banco.preparatorio.Coordenador"/>
	<mapping class="br.com.quali.banco.preparatorio.CursoDeIsoladas"/>
		
	
</session-factory>  
[/code]

A classe teste é

[code]package br.com.quali.preparatorio.repositorio;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import br.com.quali.preparatorio.entidade.Aluno;
import br.com.quali.preparatorio.entidade.Coordenador;
import br.com.quali.preparatorio.entidade.CursoDeIsoladas;
import br.com.quali.preparatorio.entidade.Endereco;

import br.com.quali.preparatorio.entidade.Professor;

public class TesteHibernate {

/**
 * @param args
 */
public static void main(String[] args) {

	AnnotationConfiguration ac = new AnnotationConfiguration();
	ac.configure();
	SessionFactory sf = ac.buildSessionFactory();
	Session s = sf.openSession();
	
	Aluno a =  new Aluno();
	a.setNome("Aluno1");
	a.setCpf("11111111111");
	
	Endereco e = new Endereco();
	e.setDescricao("Rua do A, 123");

// em Pessoa eu tenho:
//@ManyToMany (mappedBy=“pessoas”)
// private List enderecos;

// Aluno, Professor e Coordenador estendem Pessoa que estende EntidadeBasica (que apenas tem o id)
// Eu quero vincular esse endereço acima ao Aluno1
// a.setEnderecos(List);

//

	Professor p =  new Professor();
	p.setNome("Professor1");
	p.setCpf("22222222222");

// Em Coordenador
// @OneToOne(mappedBy = “coordenador”)
// private CursoDeIsoladas cursoDeIsoladas;
Coordenador c = new Coordenador();
c.setNome(“Coordenador1”);
c.setCpf(“33333333333”);

//Em CursoDeIsoladas
// @OneToOne
// @JoinColumn(name=“id_coordenador”)
// private Coordenador coordenador;
CursoDeIsoladas d = new CursoDeIsoladas();
d.setDescricao(“Matemática”);
d.setCargaHoraria(“40”);
d.setCoordenador©;

	System.out.println(c);
	
	s.beginTransaction();		
	s.save(a);
	s.save(p);
	s.save(c);
	s.save(d);
	s.getTransaction().commit();

	s.close();
	System.out.println("fim");
	

}

}
[/code]

No erro a classe é essa br.com.quali.preparatorio.entidade.Coordenador e na configuração do hibernate está assim br.com.quali.banco.preparatorio.Coordenador, ajuste o pacote ou corrija a configuração do hibernate que deve funcionar.

Coordenador deve não etar marcado com @Entity, ou se ele estiver, pode ser que esteja em um jar diferente do contexto de persistencia.

Abraço

Obrigada aos dois.

É isso mesmo, consertei os dois erros que vocês apontaram, coloquei na Entidade Pessoa (eu me esqueci de dizer que Aluno, Coordenador e Professor herdam nome e cpf dela ):

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Pessoa extends EntidadeBasica {

}

As tabelas foram criadas, mas não sei como fazer o vínculo entre Aluno e Endereço por exemplo.

public class TesteHibernate {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		AnnotationConfiguration ac = new AnnotationConfiguration();
		ac.configure();
		SessionFactory sf = ac.buildSessionFactory();
		Session s = sf.openSession();
		
		Aluno a =  new Aluno();
		a.setNome("Aluno1");
		a.setCpf("12345678911");
		System.out.println(a.getNome());
		
		Endereco e = new Endereco();
		e.setDescricao("Rua do A, 123");
		
		List<Pessoa> pessoas = new ArrayList<Pessoa>();
		pessoas.add(a);
		e.setPessoas(pessoas);
		
		
		Pessoa p =  new Professor();
		p.setNome("Professor1");
		p.setCpf("12345678912");
		
		
	
		Coordenador c =  new Coordenador();
		c.setNome("Coordenador1");
		c.setCpf("33333333333");


		CursoDeIsoladas d =  new CursoDeIsoladas();
		d.setDescricao("Matemática");
		d.setCargaHoraria("40");
		d.setCoordenador(c);
		
	
		
		s.beginTransaction();		
		s.save(a);
		s.save(p);
		s.save(c);
		s.save(d);
		s.getTransaction().commit();

		s.close();
		System.out.println("fim");
		

	}

}

Há problema em :

List pessoas = new ArrayList();
Na hora de compilar, há esse aviso:
O tipo list não é genérico, ele não pode ser parametrizados com argumentos

Alguém tem ideia do que é isso?

Olhe lá para o seu import, e veja se list está sendo importado do pacote java.útil.List, caso contrário corrija.

Abraço

Obrigada, Narciso!

Coloquei o import.

Agora estou com dúvida de como eu incluo dados nas tabelas, já que o mapeamento entre Pessoa e Endereço é ManyToMany.
O que eu quero é que Rua A esteja relacionada ao aluno e rua P ao Professor e rua C ao coordenador. Só que para cada endereço eu estou incluindo uma lista de Pessoas.

package br.com.quali.preparatorio.repositorio;


import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;



import br.com.quali.preparatorio.entidade.Aluno;
import br.com.quali.preparatorio.entidade.Coordenador;
import br.com.quali.preparatorio.entidade.CursoDeIsoladas;
import br.com.quali.preparatorio.entidade.Endereco;
import br.com.quali.preparatorio.entidade.Pessoa;

import br.com.quali.preparatorio.entidade.Professor;


public class TesteHibernate {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		AnnotationConfiguration ac = new AnnotationConfiguration();
		ac.configure();
		SessionFactory sf = ac.buildSessionFactory();
		Session s = sf.openSession();
		
		Aluno a =  new Aluno();
		a.setNome("Aluno1");
		a.setCpf("12345678911");
		System.out.println(a.getNome());
		
		Endereco ea = new Endereco();
		ea.setDescricao("Rua do A, 123");
		
		List<Pessoa> pessoas = new ArrayList<Pessoa>();
		pessoas.add(a);
		ea.setPessoas(pessoas);
		
		Endereco ep = new Endereco();
		ep.setDescricao("Rua do P, 147");
		
		Professor p =  new Professor();
		p.setNome("Professor1");
		p.setCpf("12345678912");
		pessoas.add(p);
		ep.setPessoas(pessoas);
		
		Endereco ec = new Endereco();
		ec.setDescricao("Rua do C, 258");
		
		Coordenador c =  new Coordenador();
		c.setNome("Coordenador1");
		c.setCpf("33333333333");
		pessoas.add(c);
		ec.setPessoas(pessoas);

		CursoDeIsoladas d =  new CursoDeIsoladas();
		d.setDescricao("Matemática");
		d.setCargaHoraria("40");
		d.setCoordenador(c);
		
		p.setCursoDeIsoladas(d);
		
		List<CursoDeIsoladas> CursosDeIsoladas = new ArrayList<CursoDeIsoladas>();
		CursosDeIsoladas.add(d);
		a.setCusosDeIsoladas(CursosDeIsoladas);
	
		
		s.beginTransaction();	
		s.save(ea);
		s.save(ep);
		s.save(ec);
		s.save(a);
		s.save(p);
		s.save(c);
		s.save(d);
		s.getTransaction().commit();

		s.close();
		System.out.println("fim");
		

	}

}

`
Eu quero esse resuldado
Codigo da Pessoa | Código do Endereço
1 1
2 2
3 3
Mas o que eu tenho na tabela é
1 1
2 1
3 1
1 2
2 2
3 2
1 3
2 3
3 3

Eu não estou sabendo usar o List.

Por ser ManyToMany : em Pessoa eu tenho uma lista de endereços e em endereços eu tenho uma lista de Pessoas
Em endereço o set que foi gerado automaticamente faz com que eu tenha um setPessoas que é uma lista de pessoas.

Alguém tem uma dica para resolver isso?

O senário que você disse que quer, na verdade não é ManyToMany, é OneToOne.

No caso de ser OneToOne, o que você precisa estudar seria persistencia em cascata (Cascade), aonde você vai gravar uma pessoa, e automaticamente vai guardar o endereço dela.

Até entendo que o relacionamento pode ser ManyToMany entre endereço e pessoa (um endereço eventualmente pode estar associado a mais de uma pessoa diferente), mas não consigo imaginar o motivo pelo qual você quardou a referencia das pessoas no endereço, creio não ser necessário, embora um relacionamento many to many, não significa que endereço referencie as pessoas ao qual ele está associado, isso claro, no ponto de vista da orientação a objetos.

Vou deixar as referencias aqui sobre relacionamento e cascade do jboss, mas tem um livro que é (creio) um classico de hibernate, apesar de não estar mais atualizado, ainda é muito util:

Relationships e Cascade: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

O livro é o Java Persistence With Hibernate, é um calhamaço mas ele começa do basico e vai crescendo a tópicos mais avançados:
http://www.livrariacultura.com.br/scripts/resenha/resenha.asp?nitem=2211104&sid=02211285713105395466695525

Narciso, o relacionamento que eu quero é ManyToMany mesmo.

Eu não tô sabendo como incluir os dados nesse tipo de relacionamento.

Pessoa tem uma lista de endereços. Endereço tem uma lista de Pessoas.

Quando incluo um aluno, eu quero incluir o endereço dele.

Aluno a = new Aluno();

a.setNome(“Aluno1”);

a.setCpf(“12345678911”);

Endereco ea = new Endereco();

ea.setDescricao(“Rua do A, 123”);

List pessoas = new ArrayList();

pessoas.add(a);

ea.setPessoas(pessoas);

Quando incluo um professor, eu quero incluir o endereço dele.

Endereco ep = new Endereco();

ep.setDescricao(“Rua do P, 147”);

Professor p = new Professor();

p.setNome(“Professor1”);

p.setCpf(“12345678912”);

pessoas.add§;

ep.setPessoas(pessoas); --> aqui já tem complicação porque eu não tô guardando nesse momento só o professor, eu tô guardando também o aluno que já foi incluido na lista anteriormente.

Eu quero esse resuldado no início e depois eu colocaria outros endereços relacionados ao aluno, professor e coordenador
(Por coincidência está parecendo ser um relacionamento OneToOne, mas não é)

Codigo da Pessoa | Código do Endereço
1 1
2 2
3 3
Mas o que eu tenho na tabela é
1 1
2 1
3 1
1 2
2 2
3 2
1 3
2 3
3 3

Será que eu consegui explicar melhor qual é o problema?

Obrigada pela dica do livro e do link!