[RESOLVIDO]Problema Hibernate 4( nested transactions not supported )

Boa Tarde pessoal, estou apredendo Hibernate+JSF e neste projeto nao consigo salvar os dados no banco. Consigo navegar entre as paginas perfeitamente, e quando clico em salvar(na tela de cadastro Professores), é redirecionado para a tela de exibição(tabela) como esperado, porem os dados não sao gravados no banco, na tela de exibição mostra apenas a linha refente ao cadastro anteriores(inclusive com o ID auto-incrementado), porem se eu voltar a exibir ja aparece em branco novamente.
E a seguinte exceçao eh lançada:

org.hibernate.TransactionException: nested transactions not supported)

Em outros topicos achei que o problema esta no Hibernate 4, nao aceita trnsaçoes “aninhadas”. Como nao quero retroagir a versão do Hibernate, alguem consegue me dar um exemplo de como usar outro tipo de transação sem alterar muito o codigo? Obrigado desde já.

log completo da exceçao:

org.hibernate.TransactionException: nested transactions not supported at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:152) at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1363) at br.com.dao.DAO.rollback(DAO.java:51) at br.com.dao.ProfessorDAO.salvar(ProfessorDAO.java:17) at br.com.controller.ControllerProf.salvar(ControllerProf.java:44) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.el.parser.AstValue.invoke(AstValue.java:264) at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:70) at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) at javax.faces.component.UICommand.broadcast(UICommand.java:315) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

-------Tela de requisição formprof.jsp

[code]

Cadastro de Professores




[/code]

—ManagedBean ProfessorControl (ControllerProf.Java)

[code]public class ControllerProf {

private Professor professor;
//private DataModel model;

private Map<String, Object> categoriaitem=null;

public Professor getProfessor() {
	return professor;
}

public void setProfessor(Professor professor) {
	this.professor = professor;
}

public Map<String, Object> getCategoriaitem() {
	return categoriaitem;
}

public void setCategoriaitem(Map<String, Object> categoriaitem) {
	this.categoriaitem = categoriaitem;
}

public ControllerProf(){
	professor = new Professor();
}

public String salvar(){
	ProfessorDAO profdao = new ProfessorDAO();
	profdao.salvar(professor);
	return "salvar";
}

public List<Professor> getTodos(){
	ProfessorDAO profdao = new ProfessorDAO();
	ArrayList<Professor> list = new ArrayList<Professor>(profdao.todosProfs());//(profdao.todosProfs());
	return list;
}

public Map<String, Object> getCategorias(){
	ProfessorDAO profdao = new ProfessorDAO();
	categoriaitem = new LinkedHashMap<String, Object>();
	
	for (Iterator iter = profdao.todosProfs().iterator();iter.hasNext();){
		Professor p = (Professor) iter.next();
		categoriaitem.put(p.getNome(), p.getNome());
	}
	return categoriaitem;
}

public String novocadastro(){
	professor = new Professor();
	return "novo";
}

}[/code]

—ProfessorDAO.java

[code]public class ProfessorDAO extends DAO {

public void salvar(Professor professor){
	try{
		begin();
		getSession().save(professor);
		commit();
	}catch (HibernateException e) {
		rollback();
	}
}

public List todosProfs(){
	List list = getSession().createQuery("from Professor").list();
	return list;
}

}[/code]

—Tela de Exibição(mostraprofs.jsp)

[code]

Exibição de Professores    [/code]

Essa aí, qualquer ajuda será bem vinda. Alguem?

Tente após o dar o commit, fechar a transação. [=

Cara vc eh mestre valeu mesmo, deu vergonha, só nao vou excluir pra q outro iniciante com esse guia nao cometa a mesma presepada aqui apresentada… lmao

Jakefrog manja pacas! E obrigado por não excluir, estou com o mesmo problema e espero que se resolva assim também!

Cara no meu dando o “session.close();” estava dando a exception de session is already closed(ou algo do gênero). Aí ao invés de fechar eu dei um clear. A pergunta é, o clear é aconselhavel? Pelo que eu entendi ele faz quase tudo igual ao “session.close();” a única GRANDE DIFERENÇA é que ele não fecha a conexão. Posso utiliza-lo mesmo ou teria alguma contra-indicaçao?

Cara no meu dando o “session.close();” estava dando a exception de session is already closed(ou algo do gênero). Aí ao invés de fechar eu dei um clear. A pergunta é, o clear é aconselhavel? Pelo que eu entendi ele faz quase tudo igual ao “session.close();” a única GRANDE DIFERENÇA é que ele não fecha a conexão. Posso utiliza-lo mesmo ou teria alguma contra-indicaçao?[/quote]Não sei te falar utilizando o hibernate direto. Não sei como o clear do hibernate se comporta, o ideal é você ler a documentação.

Pessoal, estou com o mesmo problema.

Se duas janelas do browser, diferentes, tentarem salvar no banco, acessando de forma concorrente, eu pego a exceção java.lang.Exception: org.hibernate.TransactionException: nested transactions not supported.

Como uso glassfish e estou gerenciando a conexão na mão, ou seja, o glassfish é só pra servidor web mesmo, não uso jpa nem gerencio a conexao pelo container, quando uso session.close() ele reclama de session is already closed. Então como nossa colega utilizei o session.clear().

No caso tenho a mesma dúvida, o clear libera a conexão e a devolve para o pool?

No caso, porque será que estou tendo este problema? Hibernate 4.1

[quote=pirado18]Pessoal, estou com o mesmo problema.

Se duas janelas do browser, diferentes, tentarem salvar no banco, acessando de forma concorrente, eu pego a exceção java.lang.Exception: org.hibernate.TransactionException: nested transactions not supported.

Como uso glassfish e estou gerenciando a conexão na mão, ou seja, o glassfish é só pra servidor web mesmo, não uso jpa nem gerencio a conexao pelo container, quando uso session.close() ele reclama de session is already closed. Então como nossa colega utilizei o session.clear().

No caso tenho a mesma dúvida, o clear libera a conexão e a devolve para o pool?

No caso, porque será que estou tendo este problema? Hibernate 4.1[/quote]
Iae camarada, como ta? De boa?

Então cara o meu problema era que eu estava usando a mesma session em dois métodos ou duas classes diferentes(não me lembro) … aí o que fiz, foi dar um jeito de sempre que uma das classes terminarem de usar a session, fecha-la e a outra caso necessite abri-la. Foi isso que resolveu pra mim, espero que tenha ajudado. :confused: