Problema para atualizar dados (OneToMany/ManyToOne)

6 respostas
M
Olá a todos!!Estou com o seguinte problema:
in thread "main" org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
	at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410)
	at org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:43)
	at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
	at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61)
Tenho duas classes Jogador e Time onde seguem abaixo:
@Entity
public class Time {
	
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
	
@Column(name="nome")
private String nome;
	
@OneToMany(mappedBy="time")
Set<Jogador> jogadores;
...
@Entity
@Table(name="jogador")
public class Jogador {
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Long id;
	
	@Column(name="nome", length=255)
	private String nome;
	
	@Column(name="pais", length=50)
	private String pais;
	
	@ManyToOne
	@JoinColumn(name="idTime")
	private Time time;
O método pra atualizar do TimeDao:
public Time carregar(Long id){
		//HibUtil.getSessao().close();
		Time time = (Time) HibUtil.getSessao().load(Time.class, id);
		HibUtil.getSessao().close();
		return time; 
	}
public void atualizar(Time time){
		Time atual = carregar(time.getId());
		atual.setNome(time.getNome());
		HibUtil.getSessao().update(atual);
		HibUtil.getSessao().beginTransaction().commit();
		HibUtil.getSessao().close();
	}
E o código pra atualizar:
Time time = new TimeDao().carregar(new Long(1));
		time.setNome("Sampa");
		///time.getJogadores().add(new JogadorDao().carregar(new Long(1)));
		new TimeDao().atualizar(time);
Já tentei, encerrar as sessões e reabrilas novamente, mas não deu em nada!!

6 Respostas

H

Código Original

Altere este código para

Acho que com essa alteração funcione.

M

Acho que não é problema não, o problema é com as sessões!!Duas sessão abertas!!

H

Analisando este trecho de código.

public Time carregar(Long id){ //HibUtil.getSessao().close(); Time time = (Time) HibUtil.getSessao().load(Time.class, id); HibUtil.getSessao().close(); return time; } public void atualizar(Time time){ Time atual = carregar(time.getId()); atual.setNome(time.getNome()); HibUtil.getSessao().update(atual); HibUtil.getSessao().beginTransaction().commit(); HibUtil.getSessao().close(); }
Lá vai a minha pergunta , esse método HibUtil.getSessao() retorná cada vez uma nova sessão ou reutiliza a mesma.

Se eu estiver enganado me corrija , mas a sessão do Hibernate por seu uma coisa custoza no sistema só deve ser carregado apenas uma vez.

Ou seja, mesmo que você continue tendo este método você deve retorna sempre a mesma sessão. Porque cada vez que você cria uma nova sessão todas as suas classes mapeadas serão carregadas.

E outra coisa só no método carregar você está abrindo a conexão 2 vezes , no método atualizar 3 vezes .

Cria uma nova sessão é carrega um Time com o id passado.

Cria uma nova sessão e fecha ao mesmo tempo.

Dá uma olhada nisso.

M
Está assim meu HibUtil:
public class HibUtil {
	
	public static SessionFactory factory;
	public static Session sessao;
	static{
		try{
			factory = new AnnotationConfiguration().configure().buildSessionFactory();
		}catch(Throwable ex){ex.printStackTrace();}
	}
	
	@SuppressWarnings("unused")
	public static Session getSessao(){
		sessao = factory.openSession();
	 return sessao;
	}
}
H

Tenho quase certeza que é isso aqui.

@OneToMany(mappedBy="time" , fetch = fetchType.EAGER) Set&lt;Jogador&gt; jogadores;

@ManyToOne(fetch = fetchType.EAGER) @JoinColumn(name="idTime") private Time time;

M

hauhau!Rapaz, mesma coisa!!

Criado 15 de outubro de 2007
Ultima resposta 15 de out. de 2007
Respostas 6
Participantes 2