Erro Transaction already active

2 respostas
R

Olá, estou tentando gravar a sessão do usuario enquanto ele navega na aplicação web, porém consigo gravar quando ele entra no site, mas quando ele muda de página o sistema atualiza um campo chamado saida e cria outro registo com o mesmo ID da sessão…

Quando ele troca de pagina acontece o erro
java.lang.IllegalStateException: Transaction already active

Esse é o codigo Java que coloquei para gravar:

public void create(T entity) {
		entityManager.getTransaction().begin();
		entityManager.persist(entity);
		entityManager.getTransaction().commit();
	}
	
	public void update(T entity) {
		entityManager.getTransaction().begin();
		entityManager.merge(entity);
		entityManager.getTransaction().commit();
	}
	
	public void destroy(T entity) {
		entityManager.getTransaction().begin();
		entityManager.remove(entity);
		entityManager.getTransaction().commit();
	}

Porém se eu colocar esse codigo em cima de cada Começo de transação recebo um erro:

Transaction not active

Alguém pode me ajudar com isso?

2 Respostas

R

Será que ninguém pode me ajudar?
Não estou achando solução para resolver isso, por favor, alguém me ajude!

R

Eu uso um interceptor para registrar a sessão do usuario no meu banco…

@Intercepts
public class LogInterceptor implements Interceptor {

	private final Result result;
	private final Sessao sessao;
	private final Sessaolog sessaoLog;
	private final SessaologRepository sessaoLogDAO;
	private final SessaoRepository sessaoDAO;
	private final HttpServletRequest request;

	public LogInterceptor(Result result, Sessao sessao, Sessaolog sessaoLog,
			SessaologRepository sessaoLogDAO, SessaoRepository sessaoDAO,
			HttpServletRequest request) {
		super();
		this.result = result;
		this.sessao = sessao;
		this.sessaoLog = sessaoLog;
		this.sessaoLogDAO = sessaoLogDAO;
		this.sessaoDAO = sessaoDAO;
		this.request = request;
	}

	@Override
	public boolean accepts(ResourceMethod resource) {
		return true;
	}
	
	@Override
	public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException {
		if(sessao.getId() == null){
			sessao.setDataInicio(GregorianCalendar.getInstance());
			sessao.setJsession(request.getSession().getId());
			sessaoDAO.create(sessao);
		}
		Sessaolog sessaoAnterior = sessaoLogDAO.findByLastSessao(sessao.getId());
		if (sessaoAnterior != null){
			sessaoAnterior.setSaida(GregorianCalendar.getInstance());
			sessaoLogDAO.update(sessaoAnterior);
		}
		sessaoLog.setSessao(sessao);
		sessaoLog.setInicioRequisicao(GregorianCalendar.getInstance());
		sessaoLog.setUrl(request.getRequestURI());
		result.include("empresa", sessao.getEmpresa() == null ? "" : sessao.getEmpresa().getEmpresa());
		result.include("filial", sessao.getEmpresa() == null ? "" : sessao.getEmpresa().getFilial());
		stack.next(method, resourceInstance);
		sessaoLog.setFimRequisicao(GregorianCalendar.getInstance());
		sessaoLogDAO.create(sessaoLog);
	}
}

SessaoLogRepositoryImpl

@Component
public class SessaologRepositoryImpl 
    extends Repository<Sessaolog, Long>
    implements SessaologRepository {

	SessaologRepositoryImpl(EntityManager entityManager) {
		super(entityManager);
	}

	@Override
	public Sessaolog findByLastSessao(Long sessaoId) {
		Query query = entityManager.createQuery("select s from Sessaolog s where id = (select max(id) from Sessaolog where sessao_id = :sessao_id)");
		System.out.println(sessaoId);
		query.setParameter("sessao_id", sessaoId);
		
		try {
			return  (Sessaolog) query.getSingleResult();
		} catch (Exception e) {
			return null;
		}
	}
}
Criado 26 de julho de 2011
Ultima resposta 27 de jul. de 2011
Respostas 2
Participantes 1