1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

FJ28 Vraptor Integração TransactionManager Spring

Olá!

Estou implementando o transactionManager do spring no Vraptor, os erros de classes e dependencias eu já arrumei e está funcionando a parte que salva, persisti, atualiza, mergea e as consultas, apenas os metodos que são utilizados para deletar meus objetos que está retornando esses erros:

org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method delete

O metodo que estou utilizando para deletar (Controller Permissao)

@Post
    public void excluir(Permissao permissao) {
        if(this.usuarioWeb.getEmpresa().getPermissoes().contains(permissao)){
            //Gerando Mensagem de exclusao antes de excluir para evitar NullPointer
            String mensagem = "Permissao \""+this.usuarioWeb.getEmpresa().getPermissao(permissao).getNome()+"\" excluida com sucesso!";

            //Permissao da empresa
            this.permissaoDao.excluir(this.usuarioWeb.getEmpresa().getPermissao(permissao)); //O ERRO OCORRE NESTA LINHA
            this.usuarioWeb.getEmpresa().getPermissoes().remove(permissao);
            this.result
                .include("mensagem_sucesso", mensagem)
                .redirectTo(this).listar();

        }

O metodo Dao (PermissaoDao)

public class HibernatePermissaoDao implements PermissaoDao {
    private final Session session;
    private Padrao padrao;
    private Permissao permissaoZero;

    public HibernatePermissaoDao(Session sessao, Padrao padrao) {
        this.session = sessao;
        this.padrao = padrao;
        this.permissaoZero = new Permissao();
        this.permissaoZero.setCod_per(0);
    }

    @Override
    @Transactional
    public void excluir(Permissao permissao) {
//        this.session.beginTransaction();
        this.session.delete(permissao);
//        this.session.getTransaction().commit();
    }

Minha Session

@Component
public class Sessao implements ComponentFactory<Session>{
    private final SessionFactory fabrica;
    private final Proxifier proxifier;
    private Session sessao;


    public Sessao(final SessionFactory fabrica, final Proxifier proxifier) {
        this.fabrica = fabrica;
        this.proxifier = proxifier;
    }

    @PostConstruct
    public void openSession() {
        this.sessao = proxifier.proxify(Session.class, new MethodInvocation<Session>() {
            @Override
            public Object intercept(Session proxy, Method method, Object[] args, SuperMethod superMethod) {
                Session sessionDoSpring = SessionFactoryUtils.doGetSession(fabrica, true);
                return new Mirror().on(sessionDoSpring).invoke().method(method).withArgs(args);
            }
        });
    }

    @Override
    public Session getInstance() {
        return this.sessao;
    }

    @PreDestroy
    public void closeSession() {
        this.sessao.close();
    }
}

Application Context

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

    <tx:annotation-driven />
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="configLocation">
            <value>classpath:/hibernate.cfg.xml</value>
        </property>
    </bean>

</beans>

Como está na apostila estou gerando as interfaces para cada Dao criado, de acordo com a maneira que o Spring precisa para receber a classe.

Edit: Adicionando a Classe @SessionScoped

@Component
@SessionScoped
public class UsuarioWeb {
    private Usuario usuario;
    private Empresa empresa;

    public Usuario getUsuario() {
        return this.usuario;
    }

    public void setUsuario(Usuario usuario) {
            this.usuario = usuario;
    }

    public boolean isLogadoUsr() {
        return this.usuario != null;
    }

    public void logoffUsr() {
        this.usuario = null;
    }

    public void setEmpresa(Empresa empresa) {
            this.empresa = empresa;
    }

    public Empresa getEmpresa() {
        return this.empresa;
    }

    public Boolean isLogadoEmp() {
        return this.empresa!=null;
    }

    public void logoffEmp() {
        this.empresa=null;
    }
}

Web.xml

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <filter>
        <filter-name>openSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
        <init-param>
            <param-name>sessionFactoryBeanName</param-name>
            <param-value>sessionFactory</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>openSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>vraptor</filter-name>
        <filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>vraptor</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags delete hibernate spring transações vraptor ou faça a sua própria pergunta.