Ola pessoal, estou com o seguinte erro no hibernate.
Illegal attempt to associate a collection with two open sessions
Segundo minhas pesquisas nos foruns é que estou com duas sessões abertas.
Mesmo assim continuo com a dúvida de como resolver o problema.
Este é o meu DAO Genérico
public GenericDao(T t) {
this.t = t;
}
public void gravar() {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tr = session.beginTransaction();
session.save(t);
tr.commit();
session.close();
return;
}
public void atualizar() {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tr = session.beginTransaction();
session.update(t);
tr.commit();
session.close();
return;
}
O Service é:
public void addTriagem(Triagem t){
GenericDao<Triagem> dao = new GenericDao<Triagem>(t);
dao.gravar();
}
public void editTriagem(Triagem t){
GenericDao<Triagem> dao = new GenericDao<Triagem>(t);
dao.atualizar();
}
Trexo de código onde adiciono é este
TriagemService triagemService = new TriagemService();
triagemService.addTriagem(t);
PacienteService pacienteService = new PacienteService();
pacienteService.atualizaPaciente(paciente);
Desde já agradeço a ajuda de vocês.
Abraços!
calel
Novembro 23, 2011, 10:14pm
#2
Você utiliza a mesma instanci de triagem para salvar e atualizar? ou cria uma nova para atualizar?
Também é interessante colocar o session.close() em um bloco finally só por precaução.
Todas as vezes que eu utilizo um serviço. Eu crio uma nova instancia.
calel
Novembro 23, 2011, 10:43pm
#4
Sugiro uns testes:
1- No seu método ao invés de utilizar openSession você poderia utilizar o getCurrentSession().
2 - Salvar a triagem, carrega-la da base, alterar uma propriedade e depois chamar o editTriagem.
Obrigado pela atenção calel
Então, tentei trocar os sessions por getCurrentSession.
da erro. Logo ao iniciar o sistema. Pois não existe nenhuma sessão corrente. (Acredito)
E quanto ao salvar a triagem. Eu tenho problemas na hora de salvar as alterações no paciente.
Quando debuguei o código ele mostra que o erro ocorre na segunda alteração!
Vou testar novamente com outras formas de getCurrentSession();
Mais obrigado por enquanto!
calel
Novembro 24, 2011, 7:43am
#6
Não tenho nenhum exemplo aqui, mas um pessoal falava de utilizar ThreadLocal para não ficar abrindo várias sessões também.
Esse getCurrentSession eu estava lendo que criava a session caso não existisse, podem ter me passado a informação incorreta… Mas caso ele retorne null você poderia fazer
session = getCurrentSession();
if( session == null)
session = openSession();
calel,
agora tenho outro erro. Tentei aplicar o getCurrentSession so na classe que realmente precisa.
Agora o erro é:
No CurrentSessionContext configured!
calel
Novembro 24, 2011, 8:50am
#8
Tenta acrescentar essa linha no seu hibernate.cfg.xml
Então calel.
O Hibernate ta reclamando que:
Illegal attempt to associate a collection with two open sessions
Que eu abro duas sessões para uma unica operação!
Pelo certo aquele getCurrentSession();
era para funcionar.
Mais ñ to conseguindo fazer!
blaithe
Novembro 24, 2011, 9:11am
#10
public void atualizar() {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tr = session.beginTransaction();
session.update(t);
tr.commit();
session.close();
return; << que p... é essa, o metodo não é void??
}
blaithe
Novembro 24, 2011, 9:12am
#11
Mostra ai seu hibernate util…
Segue
[code]
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
Configuration cfg = new AnnotationConfiguration();
cfg.configure(“br/com/anglo/Clinica/util/hibernate.cfg.xml”);
sessionFactory = cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}[/code]
o return sem nada informa o fim do método. Mais posso tirar, ñ influencia em nada.
blaithe
Novembro 24, 2011, 9:23am
#13
[code]import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
public class HibernateUtil {
public static final SessionFactory sessionFactory;
public static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
public HibernateUtil() {
}
static {
try {
sessionFactory = new AnnotationConfiguration().configure("br/com/anglo/Clinica/util/hibernate.cfg.xml").buildSessionFactory();
} catch (Throwable ex) {
System.err.println("-----------------------------Erro SessionFactory---------------------------------");
System.err.println("Initial SessionFactory creation failed." + ex);
System.err.println("-----------------------------Fim SessionFactory---------------------------------");
throw new ExceptionInInitializerError(ex);
}
}
public static Session getInstance() throws Exception {
Session session = (Session) threadLocal.get();
if (session == null) {
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
}[/code]
Usa esse… testa, vê o erro que vai dar no console…
blaithe
Novembro 24, 2011, 9:34am
#14
Exemplo:
[code]public class GenericDao {
protected Session s;
protected Transaction tr;
protected Query q;
public GenericDao(T t) {
this.t = t;
}
public void salvar() throws Exception {
s = HibernateUtil.getInstance();
tr = null;
try{
tr = s.beginTransaction();
s.save(t);
tr.commit();
} catch(Exception e){
e.printStackTrace();
tr.rollback();
} finally{
s.close();
}
}[/code]
Faz sua transação assim… não tem como dar merda, e se der você vai saber certinho onde foi…
Ola pessoal, :roll:
Conseguir resolver o problema.
Infelizmente era algo bobo que não consegui identificar no inicio.
Havia esquecido de fechar uma sessão de busca listagem de pacientes.
Por isso que ficou assim.
Desde já agradeço a atenção de todos.
FabioNoth:
mantem o mesmo erro! :?
FabioNoth, como resolveu o sem problema de duas sessões abertas?
Obrigado.
Nicocelli, leia o que está acima do seu post.
Falta de atenção da minha parte!
Não tinha visto que tinha duas páginas.
Obrigado.
[quote=calel]
session = getCurrentSession();
if( session == null)
session = openSession();
[/quote]
[quote=calel]Tenta acrescentar essa linha no seu hibernate.cfg.xml
esses 2 trechos que o calel postou… ja resolveram meu problema o/* (tbm fechei a sessão do método de busca… no finally)