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

7 respostas
A
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
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Cadastro de Professores</title>
</head>
<body>
	<f:view>
		<h:form>
			<h:outputText value="Cadastro Professores" />
			<br />
			<br />
			<h:outputText value="Nome:" />
			<h:inputText id="nome" size="60"
				value="#{professorControl.professor.nome }" />
			<br />
			<h:outputText value="Formação Principal:" />
			<h:selectOneMenu value="#{professorControl.professor.formacao }"
				id="formacao">
				<f:selectItem id="opt1" itemLabel="Analista de Sistemas"
					itemValue="Analista de Sistemas" />
				<f:selectItem id="opt2" itemLabel="Processamento de Dados"
					itemValue="Processamento de Dados" />
				<f:selectItem id="opt3" itemLabel="Ciencia da Computação"
					itemValue="Ciencia da Computação" />
				<f:selectItem id="opt4" itemLabel="Outros" itemValue="Outros" />
			</h:selectOneMenu><br/><br/>
			<h:commandButton action="#{professorControl.salvar }" value="Salvar" />
			<h:commandButton action="cancelar" value="Cancelar" />
		</h:form>
	</f:view>
</body>
</html>
---ManagedBean ProfessorControl (ControllerProf.Java)
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";
	}
}
---ProfessorDAO.java
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;
	}
}
---Tela de Exibição(mostraprofs.jsp)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Exibição de Professores</title>
</head>
<body>
<f:view>
	<h:form>
		<h:dataTable value="#{professorControl.todos }" var="prof" border="1">
			<f:facet name="header">
				<h:outputText value="Professores" />
			</f:facet>
			<h:column>
				<f:facet name="header">
					<h:outputText value="ID" />
				</f:facet>
				<h:outputText value="#{prof.id}" />
			</h:column>
			<h:column>
				<f:facet name="header">
					<h:outputText value="Nome" />
				</f:facet>
				<h:outputText value="#{prof.nome}" />
			</h:column>
			<h:column>
				<f:facet name="header">
					<h:outputText value="Bacharelado" />
				</f:facet>
				<h:outputText value="#{prof.formacao}" />
			</h:column>
		</h:dataTable>
		<h:commandLink action="Novo" value="Novo cadastro" />
		&nbsp;&nbsp;
		<h:commandLink action="Início" value="Página Inicial" />
	</h:form>
</f:view>
</body>
</html>

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

7 Respostas

H

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

A

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

V

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

V

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?

H

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?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.

P

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

V

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


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:

Criado 4 de junho de 2012
Ultima resposta 16 de fev. de 2013
Respostas 7
Participantes 4