Transação com JPA e EJB

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

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

Tirei o getEntityManager().clear(), vou fazer uns teste aqui, depois coloco a resposta.

Obrigado a todos.