Dúvidas sobre EJB [ RESOLVIDO ]

2 respostas
G

Olá Pessoal,

Estou começando a desenvolver com EJB e tenho algumas dúvidas.

Por exemplo, li que o EJB fica responsável pelo Controle da Transação ( COMMIT e ROLLBACK ).
Automaticamente por DEFAULT ( Estou utilizando EJB3 com JBOSS SEAM, em um servidor JBOSS )

Até ai tudo bem, no entato quando solicito para o Entity Manager persistir um objeto, vejo no console:

11:57:10,500 INFO  [STDOUT] Hibernate: 
    insert 
    into
        accion.login_loginweb
        (BO_SUCESSO_LOGINLW, DATACREATE, IP_LW, webUsuarioId, LOGLLOGINWEBID) 
    values
        (?, ?, ?, ?, ?)

Porém, o registro não foi inserido quando faço um select no banco.
Provavelmente ele não foi comitado.

Então minha dúvida é, como ele gerencia esse lance de transação automaticamente.
Ele vai dar um COMMIT em algum momento, ou tenho que deixar isso explicito para ele?

Vi em alguns DAO genéricos o pessoal usando sem commit também.

Muito obrigado.

2 Respostas

Jair_Rillo_Junior

E ai Gbzao, blz?

Você realmente está certo, por default, a transação no EJB3 é controla pelo container (através de JTA). Porém é bom ressaltar que isso acontece quando você está rodando dentro de um ambiente JEE 5, isso significa por exemplo, se você está usando JPA dentro de um Servlet, você deve usar o UserTransaction (application-managed) ao invés de container-managed.

Então nos informe (ou mostre) o seu código de PERSIST do JPA, se está em um servlet, se está em um session beans, etc.

G

Manchester,

Obrigado pelos esclarecimentos iniciais, segue meu código conforme solicitado:

@Stateful
@Name("autenticacao")
@Scope(ScopeType.CONVERSATION)
public class Login implements ILogin, Serializable {

    @In(value = "webUsuario", required = false)
    @Out(value = "webUsuario", required = false)
    private WebUsuario webUsuario;
    
    @In(value = "webUsuarioFilial", required = false)
    @Out(value = "webUsuarioFilial", required = false)
    private WebUsuarioFilial webUsuarioFilial;
   
    @PersistenceContext(type=PersistenceContextType.EXTENDED)
    EntityManager entityManager;
   
    @Logger
    Log log;
   
    @In
    Identity identity;

    public void registraLog(String boSucesso, Integer webUsuarioId, String ip) {
        LogLoginWeb log1 = new LogLoginWeb();
        log1.setId(ProxSequencia.getProxSequencia("log_loginweb", "loglloginwebid"));
        log1.setBoSucesso(boSucesso);
        log1.setIp(ip);
        log1.setWebUsuarioId(webUsuarioId);
        log1.setData(new Date());
        
        try {
            entityManager.persist(log1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }

    ... mais alguns métodos

Era cagada minha no mapeamento :oops:
Ele criou outra tabela e estava inserindo o nome lá.
Agora está funcionando 100% :smiley:

Criado 25 de julho de 2008
Ultima resposta 25 de jul. de 2008
Respostas 2
Participantes 2