Salvar usando JBoss (Resolvido)

2 respostas
C
Pessoal estou desenvolvendo um sistema com primeFaces, EJB e JBoss 7 pra controlar sessao. Vou postar os códigos. GenericDAO:
public abstract class GenericDAOImpl<E> implements GenericDAO<E> {

    @PersistenceContext(unitName="transbrDS")
    private EntityManager entityManager;

     public Session getSession() {
    	return (Session) entityManager.getDelegate();
    }

    public void save(E pojo) {
    	getSession().saveOrUpdate(pojo);
    }
    ........
}
CarretaDAO:
public void addCarreta(Carreta carreta) {
        save(carreta);
    }
Service:
public void addCarreta(Carreta carreta) {
		carretaDAO.addCarreta(carreta);
	}
Bean:
public void finishAddCarreta() {

		Carreta cta = carretaService.getByDescricao(carreta.getDescricao(), carreta.getPlaca());

		if (carreta.getCodigo() == null && cta != null) {
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro:", "Descrição ou Placa já cadastrada"));
		} else if (carreta.getDescricao() != null && carreta.getPlaca() != null
				&& (carreta.getDescricao().isEmpty() || carreta.getPlaca().isEmpty())) {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro:", "Preencha os campos"));
		} else {
			carretaService.addCarreta(carreta);
			doLimparCarreta();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso:", "Registro salvo com sucesso"));
		}
	}
xhtml:
<p:commandButton value="#{msgs.cbtGravar}" action="#{carretaMBean.finishAddCarreta}"
                                                     image="ui-icon-disk" update="msgs, dtCarreta, pgSalvar"
                                                     rendered="#{!carretaMBean.cbtSalvar}"/>
O problema é quequando clico no botao para salvar o registro, dá os seguintes erros:
ARJUNA16029: SynchronizationImple.afterCompletion - failed for org.jboss.as.jpa.transaction.TransactionUtil$SessionSynchronization@152701c with exception: org.hibernate.SessionException: Session was already closed
	at org.hibernate.internal.SessionImpl.close(SessionImpl.java:269) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
	at org.hibernate.ejb.EntityManagerImpl.close(EntityManagerImpl.java:152) [hibernate-entitymanager-4.0.0.Beta5.jar:4.0.0.Beta5]
	at org.jboss.as.jpa.transaction.TransactionUtil$SessionSynchronization.afterCompletion(TransactionUtil.java:229) [jboss-as-jpa-7.0.1.Final.jar:7.0.1.Final]
	at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.afterCompletion(SynchronizationImple.java:117)
	at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.afterCompletion(TwoPhaseCoordinator.java:403)
	at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:104)
	at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:159)
	at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1159)
	at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:119)
	at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75)
	at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.endTransaction(CMTTxInterceptor.java:92)
	at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:265)
	at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.required(CMTTxInterceptor.java:359)
	at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.invoke(CMTTxInterceptor.java:219)
	at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:35)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
	at org.jboss.as.ejb3.component.session.SessionInvocationContextInterceptor.processInvocation(SessionInvocationContextInterceptor.java:71)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
	at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
	at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:146)
	at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
	at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
	at org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:76)
	at br.com.transbr.service.carreta.CarretaService$$$view1.getByDescricao(Unknown Source) [classes:]
	at br.com.transbr.managedbean.carreta.CarretaMBean.finishAddCarreta(CarretaMBean.java:113) [classes:]
       ......
       Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
      .......
      Caused by: javax.ejb.EJBTransactionRolledbackException: Transaction rolled back
      .......
      Caused by: javax.transaction.RollbackException: Could not commit transaction.
      .........
      Caused by: javax.persistence.OptimisticLockException: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
     ........
     Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
     .........
     Caused by: javax.faces.el.EvaluationException: javax.ejb.EJBTransactionRolledbackException: Transaction rolled back
     .......
     Caused by: javax.ejb.EJBTransactionRolledbackException: Transaction rolled back
     ........
      javax.faces.FacesException: #{carretaMBean.finishAddCarreta}: javax.ejb.EJBTransactionRolledbackException: Transaction rolled back

Alguém tem alguma ideia do que pode ser?

2 Respostas

H

A cada ação de save/updade/read você deve abrir e fechar a transação.

Em algum lugar ela está sendo fechada.

Altere seu código para a cada ação realizada que utilize DB, você abra a conexão com o DB uma vez e depois feche.

C

Resolvi tirando todos os clouse e commit do CarretaDAOImpl, isso porque o JBoss controla tudo isso pra mim.
Flw.

Criado 3 de dezembro de 2011
Ultima resposta 5 de dez. de 2011
Respostas 2
Participantes 2