Illegal attempt to associate a collection with two open sessions

Pessoal, boa noite!

Sei que estou errado, mas não sei como fazer certo.
Tenho 2 classes Campeonato e Clube com relacionamentos N p N em um formulario eu escolheria o clube para adicionar ao campeonato, mantendo os que já estão relacionados, pois bem. O problema é que eu não sei como trabalhar com a session, não sei se eu tenho que fechar, depois abrir… e por ai vai…
Alguem pode me dar uma dica? Da maneira que estou fazendo recebo a exception que esta no assunto.

public class selecionaClubeAction extends BaseAction{
	public String execute() throws Exception {
	
		//Recebe idClube do clube selecionado no formulario
		String idClube = input.getString("idClube");
		
		//Busca o clube no BD
		Clube clube = new Clube();
		DaoFactory daofactory = new DaoFactory();
		clube = daofactory.getClubeDao().buscaById(Clube.class, (Long.parseLong(idClube)));

		//Busca o campeonato no BD
		//exemplo no campeonato com ID=2
		Campeonato campeonato = new Campeonato();
		campeonato = daofactory.getCampeonatoDao().buscaById(Campeonato.class, 2L);


		List<Clube> clubes = new ArrayList<Clube>();

		//Adiciona mais um clube ao campeonato, mas sem tirar os que já estão relacionados
		clubes = campeonato.getClubes();
		clubes.add(clube);
		campeonato = campeonato;
		campeonato.setClubes(clubes);
		daofactory.beginTransaction();
		daofactory.getCampeonatoDao().atualiza(campeonato);
		daofactory.commit();
		daofactory.close();


}
}

Grato,
Wallfox

Fala Wallfox! Assim, vamos deixar de lado por enquanto que tá tudo dentro da action, primeiro vc tem que melhorar seu controle transacional, tipo, tudo isso q vc ta fazendo aí é uma unidade de trabalho, então seria ideal estar tudo encapsulado dentro de uma só transação… não sei como vc está fazendo o controle disso mas provavelmente com tudo na mesma transação, a mesma sessão vai ser usada pra tudo e pelo menos essa exception vc não deve mais receber!

Mas seria legal vc ficar atento pra outros detalhes como criar uma camada pras regras de negócio pra ser acessado pelo seu controller (a action nesse caso), a daofactory não precisa ser um objeto, uma classe com métodos estáticos talvez fosse melhor nesse caso e dá uma lida na documentação do hibernate sobre controle de transação e sessão também!

Se precisar de material avisa, mas acho que a documentação de referência oficial do hibernate é um bom começo!

Falowz

Ok! Dei uma lida na documentação, mas é que eu quero utilizar um DAO genérico. Talvez passando o meu DAO isso ajude. Se eu não me engano peguei um exemplo utilizando o DAO desta maneira em um exercicio da Caelun

public class Dao <T>{
	private Session session;
	private final Class classe;
	
	Dao(Session session, Class classe) {
		this.session = session;
		this.classe = classe;
	}
	
	public void adiciona(T u) throws Exception{
			this.session.save(u);
	}
	
	public void atualiza(T u) throws Exception{
		this.session.update(u);
	}

	public void delete(T u) throws Exception{
		this.session.delete(u);
	}
	
	public List<T> listaTudo(){
		return this.session.createCriteria(this.classe).list();
	}

	public T buscaById(Class<T> ClasseObjeto, Long id)throws Exception{
		final Object o;
		this.session = (Session) HibernateUtil.getSession();
		o = this.session.load(ClasseObjeto, id);		
		return (T) o;	
	}
	
	public List<T> listaOrdenado(Class<T> ClasseObjeto, String ordenar)throws Exception{
		 return session.createCriteria(this.classe)
		 .addOrder( Order.asc(ordenar))
	     .list();
	}

}

Meu DaoFactory

public class Dao <T>{
	private Session session;
	private final Class classe;
	
	Dao(Session session, Class classe) {
		this.session = session;
		this.classe = classe;
	}
	
	public void adiciona(T u) throws Exception{
			this.session.save(u);
	}
	
	public void atualiza(T u) throws Exception{
		this.session.update(u);
	}

	public void delete(T u) throws Exception{
		this.session.delete(u);
	}
	
	public List<T> listaTudo(){
		return this.session.createCriteria(this.classe).list();
	}

	public T buscaById(Class<T> ClasseObjeto, Long id)throws Exception{
		final Object o;
		this.session = (Session) HibernateUtil.getSession();
		o = this.session.load(ClasseObjeto, id);		
		return (T) o;	
	}
	
	public List<T> listaOrdenado(Class<T> ClasseObjeto, String ordenar)throws Exception{
		 return session.createCriteria(this.classe)
		 .addOrder( Order.asc(ordenar))
	     .list();
	}

}

Valew!
Wallfox