fajo
Março 13, 2012, 6:56am
#1
Oi pessoal, tudo bem?
bom, estou com um probleminha aqui, no meu código, salvo um objeto Notificacao e tb um Protocolo assim:
@ManagedBean
@ViewScoped
public class NotificacaoController implements Serializable {
...
protocoloDao.salvar(p);
notificacaoDao.salvar(notificacao);
...
e pq isso, pq o número do protocolo deve ser o mesmo da notificação - um pra um.
só q as vezes ele salva o protocolo e não salva a notificação, dá alguma problema, conexão da internet ou outro problema qualquer.
então preciso q, se der algum problema ao tentar salvar a notificação, ele dê um rollback no protocolo salvo.
Alguém poderia me dar uma ajuda?
Grato.
você esta usando EJB?
se não você que está controlando suas
Transação certo?
coloca o código do DAO
fajo
Março 13, 2012, 7:13am
#3
Oi amigo,
estou usando EJB sim.
o código do DAO é:
DAOGenericImp.java
public abstract class DaoGenericoImp<T, ID extends Serializable> implements DaoGenerico<T, ID> {
protected abstract EntityManager getEntityManager();
protected abstract Class<T> getClasseDominio();
...
@Override
public T salvar(T object) {
getEntityManager().clear();
getEntityManager().persist(object);
return object;
}
...
protocoloDaoImp:
@Stateless
public class ProtocoloDaoImpl extends DaoGenericoImp<Protocolo, ProtocoloPk> implements ProtocoloDao {
@PersistenceContext
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
@Override
protected Class<Protocolo> getClasseDominio() {
return Protocolo.class;
}
}
notificacaoDaoImp:
@Stateless
public class NotificacaoDaoImpl extends DaoGenericoImp<Notificacao, String> implements NotificacaoDao {
@PersistenceContext
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
@Override
protected Class<Notificacao> getClasseDominio() {
return Notificacao.class;
}
}
no controller:
@EJB
private NotificacaoDao notificacaoDao;
@EJB
private ProtocoloDao protocoloDao;
E pq você está fazendo getEntityManager().clear(); ?
E você está fazendo protocolo.setNotificacao(notificacao) e vice-versa?
geralmente a transacao nao fica no controller mesmo.
vc pode injetar um ejb dentro do outro, usando os dois no mesmo método. A transacao vc pode customizar com as anotacoes como @Transaction no ejb
abrasss
getEntityManager().clear()
estranho isto…
tenta tirar isto, geralmente o próprio EJB é responsável por dar o rollback, a não ser que tenha alguma configuração extra ai…
mais você pode tentar UserTransaction ut = new (“Implentação”);
ut.rollback()
Você usa o seu contexto ( EJBContext ) para obter-se um UserTransaction …
UserTransaction ut = ctx.getUserTransaction();
o UserTransaction recupera a transação ativa do AppServer
fajo
Março 13, 2012, 9:22am
#7
Tirei o getEntityManager().clear(), vou fazer uns teste aqui, depois coloco a resposta.
Obrigado a todos.