Problema com a tabela de muitos pra muitos no hibernate

Boa tarde pessoal, estou com um problema e gostaria que alguem me ajudasse.

estou com um projeto que possui algumas classes, entre elas as classes UNIDADE e CURSO, uma unidade pode ter vários cursos e um curso pode estar presente em muita unidades, caracterizando um many to many.

Eu estou fazendo uma tela de cadastro para alunos, sendo que as unidades disponíveis já virão do banco de dados através de um select e dependendo da que eu selecionar, um segundo select exibirá os cursos relacionados a essa unidade que eu escolhi.

eu consegui gerar todas as tabelas, inclusive a associativa que eu chamei de cursos-unidades, então criei uma classe com um método main() para cadastrar cursos e unidades, só que cada hora da um erro e quando mudo surge outro erro…

eu quero que a tabela associativa que tem apenas as chaves da tabela unidade e da tabela curso, quero que seja gerado uma linha para cada relacao entre unidade e curso, mas ela esta substituindo em vez de adicionar…

por exemplo:

crio duas Unidades e 5 cursos, se eu setar o mesmo curso nas duas unidades, em vez da tabela de ligação criar uma linha para cada ela deixa apenas a linha mais recente.

eu gostaria que alguém me explicasse como seria a melhor forma de fazer esse mapeamento many to many, tanto para cadastrar corretamente, quanto para resgatar os dados corretamente.

eu quero ter a opçao de buscar todos os cursos de uma unidade, ou todas as unidades que possuem um determinado curso, mas nao to sabendo mapear direito eu acho, segue abaixo o meu código na parte do mapeamento.

classe Unidade

public class Unidade implements Serializable

{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

@Column
private String nome;

@Cascade(CascadeType.ALL)
@Fetch(FetchMode.JOIN)
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="id_universidade", nullable=false)
private Universidade universidade;

@ManyToMany(fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@Cascade(CascadeType.ALL)
@JoinTable(name="unidades_cursos", joinColumns=@JoinColumn(name="id_unidade"), inverseJoinColumns=@JoinColumn(name="id_curso"))
private List<Curso> cursos;

@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name="id_endereco",nullable=false)
@Cascade(CascadeType.ALL)
private Endereco endereco;

classe curso

public class Curso implements Serializable

{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

@Column
private String nome;

@Cascade(CascadeType.ALL)
@ManyToMany(fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinTable(name="unidades_cursos", joinColumns=@JoinColumn(name="id_curso"), inverseJoinColumns=@JoinColumn(name="id_unidade"))
private List<Unidade> unidades;

se alguém puder me ajudar ficarei muito grato…

Posta ae como vc esta persistindo os objetos.
no mapeamento nao me parece ter algo errado

Oi Magno,

eu criei um projeto novo apenas pra testar o relacionamento de muitos pra muitos, eu estou testando através de uma classe com método main() mesmo.

Classe Curso

public class Curso
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name=“id_curso”)
private Long id;

@Column(name="nome", nullable=false, unique=true)
private String nome;

@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="unid_cur", joinColumns={@JoinColumn(name="cod_curso")}, inverseJoinColumns={@JoinColumn(name="cod_unidade")})
@Cascade(CascadeType.SAVE_UPDATE)
private List<Unidade> unidades;

Classe Unidade

public class Unidade
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name=“id_unidade”)
private Long id;

@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="unid_cur", joinColumns={@JoinColumn(name="cod_unidade")}, inverseJoinColumns={@JoinColumn(name="cod_curso")})
@Cascade(CascadeType.SAVE_UPDATE)
private List<Curso> cursos;

criei uma classe para gerar as tabelas, quando executo, ela me cria as tabelas UNIDADE,CURSO e UNID_CUR

o que eu quero fazer e não estou conseguindo são duas coisas:

estou cadastrando cursos e unidades através de uma classe com um método main, pois não terei um sistema para cadastro de ambos…

eu quero que ao salvar um objeto unidade, sua variavel lista de cursos, seja salva junto e quero q a tabela associativa mostre apenas o id de curso e o id da unidade…

só que não estou sabendo cadastrar direito, pois antes estava reclamanda que eu estava usando mais de um objeto session, em outros momentos a tabela associativa esta sobrescrevendo os registros da tabela associativa…

eu gostaria de aprender como eu cadastro unidade da forma correta para que a tabela de muitos pra muitos fique certa e também como faço pra resgatar depois os cursos de uma unidade para exibir dps…

resumindo: não estou sabendo cadastrar um many to many de modo que a tabela associativa guarde as referencias da forma correta e não estou sabendo resgatar um objeto com suas referencias depois…

agradeço se vocês puderem me ajudar…

Classe TestandoMapeamento

public static void main(String[] args)
{

	//criando cursos
	Curso c1 = new Curso(); c1.setNome("um");
	Curso c2 = new Curso(); c2.setNome("dois");
	Curso c3 = new Curso(); c3.setNome("tres");
	Curso c4 = new Curso(); c4.setNome("quatro");
	
	//criando uma lista para os cursos
	List<Curso> cursos = new ArrayList<Curso>();
	
	//adiciono os cursos a lista
	cursos.add(c1); cursos.add(c2); cursos.add(c3); cursos.add(c4);
	
	
	//criando unidade
	
	Unidade u1 = new Unidade();
	UnidadeDao udao = new UnidadeDao();
	
	//setando os cursos na unidade
	u1.setCursos(cursos);
	
	
	//salvando unidade
	udao.salvar(u1);

}

classe TestandoMapeamento3

public static void main(String[] args)
{
	List<Curso> cursos = new ArrayList<Curso>();
	
	
	
	
	
	//recuperando cursos já existentes no banco dados e inserindo a uma lista de cursos
	
	CursoDAO cdao = new CursoDAO();
	CursoDAO cdao2 = new CursoDAO();
	
	Curso c1 = cdao.buscarPorId(3);
	
	Curso c2 = cdao2.buscarPorId(4);
	
	cursos.add(c1);
	cursos.add(c2);
	
	//criando outra unidade
	
	Unidade unidade = new Unidade();
	
	
	unidade.setCursos(cursos);
	
	// salvando unidade
	
	UnidadeDao dao = new UnidadeDao();
	
	dao.salvar(unidade);		
}

eu li algo a respeito de que se eu tenho um objeto para cadastrar e esse objeto possui algum atributo do tipo de algum outro objeto que tb precisa ser persistido, que eu tenho q usar uma unica session pra isso, não sei se estou fazendo certo…

Como faço a mesma coisa, só que usando o Set inves do List?

Igor, boa noite.

Quando postar código de classe, coloque dentro das tags code. Vai facilitar a visualização.

Talvez esse post possa te ajudar @ManyToMany Unidirecional e Bidirecional