JPA...controle de transação ...entre dois objetos

Olá,

duvida referente ao que fazer em uma transação com dois objetos
onde vou incluir um log e um usuário só que tem que dar o commit
quando os dois foram sem erro .

E da forma que está grava o log e se der erro no usuário faz só rollback
no usuário ???

Teria outra forma de fazer :

  1. teria que controlar begin,commit na chamada do serviço
  2. fazer um serviço especifico pra tratar essa situação

Alguém teria laguma idéia como fazer ou controlar isso ???

hoje o que estou fazendo :


LogDao logDao = new LogDao()

Log log = new Log();
log.setProcesso("Processo 40");

logDao.persist(log);

UsuarioDao usuarioDao = new UsuarioDao()
Usuario usuario = new Usuario();
usuario.setNome("Novo Nome");

usuarioDao.persist(usuario);

public abstract class AbstractBaseDao<T extends Entity, ID extends Serializable>


public class LogDao extends AbstractBaseDao<Log, Long>

---DAO Generico pra todas entidades 

 public void persist(T t) throws DaoException {
    	try {
    		 
    		em.getTransaction().begin();
    		em.persist(t);
    		em.getTransaction().commit();
    	} catch(Exception e) {
    		em.getTransaction().rollback();
    	}finally{
    		
    	}


 public void merge(T t) throws DaoException {
    	try {
    //		em = factory.createEntityManager();
    		em.getTransaction().begin();
    		em.merge(t);
    		em.getTransaction().commit();
    	} catch(Exception e) {
    		em.getTransaction().rollback();
    	}finally{
    	}
    }
////////////////////////////////////////////////////////////////////////////////////
public class UsuarioDao extends AbstractBaseDao<Log, Long>

---DAO Generico pra todas entidades 

 public void persist(T t) throws DaoException {
    	try {
    		 
    		em.getTransaction().begin();
    		em.persist(t);
    		em.getTransaction().commit();
    	} catch(Exception e) {
    		em.getTransaction().rollback();
    	}finally{
    		
    	}

---
 public void merge(T t) throws DaoException {
    	try {
    //		em = factory.createEntityManager();
    		em.getTransaction().begin();
    		em.merge(t);
    		em.getTransaction().commit();
    	} catch(Exception e) {
    		em.getTransaction().rollback();
    	}finally{
    	}
    }

Uma forma primitiva seria…

[code]private boolean transacaoAutomatica = true;

public void persist(T t) throws DaoException {
try {
if (transacaoAutomatica){
em.getTransaction().begin();
em.persist(t);
em.getTransaction().commit();

} else {
em.persist(t);
}
} catch(Exception e) {
em.getTransaction().rollback();
}finally{

     }  

public Transaction getTx(){
return em.getTransatcion();
}
[/code]

Dai você teria algo… semelhante.

[code]Transaction tx = daogenerico.getTx();

tx.begin();
dao.persist(obj1);
dao.persist(obj2);
tx.commit();
[/code]