Thanks Gavin for the reply.

I finally figured something out.  Working with new technology is always fun, 
even if it is a bit frustrating.  I'm very new to using EJB3 - in fact I 
switched to using it (from tomcat/hibernate) when seam was still in it's first 
releases (mainly cvs at that time) because I saw the power of the framework).  
But now I need to go back and learn some of the things the framework manages 
for me.

I ended up putting

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

on the class and method of the called method.  Then in the method I create a 
new EntityManager.  It's a little heavy handed but does the trick.  I thought I 
could reuse the em for each transaction call; but couldn't figure it out.  It 
works, just wondering if there was a better way.  I tried a couple of things 
with UserTransaction but just didn't get it to work.  Probably my fault.

Thanks again,
Chris....


  | @Name(value="importSale")
  | @Stateful
  | @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
  | public class ImportSale implements IImport {
  |    
  |    private EntityManagerFactory emf = null;
  |    private EntityManager em;
  |    
  |    private EntityManager txEntityManager(){
  |       return getEntityManagerFactory().createEntityManager();
  |     }
  |    
  |    private EntityManagerFactory getEntityManagerFactory(){
  |       if(emf == null) {
  |          try {
  |             return (EntityManagerFactory) 
Naming.getInitialContext().lookup("java:/customEntityManagerFactory");
  |          } catch(NamingException ne) {
  |             throw new IllegalArgumentException("EntityManagerFactory not 
found", ne);
  |          }
  |       } else {
  |          return emf;
  |       }
  |    }
  | 
  |    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
  |    public void processXML(ParseFile parseFile, State state, Element record) 
{
  |       internalProcess(record);
  |    }
  |    
  |    private void internalProcess(Element record){
  |       try {
  |          em = txEntityManager();
  |          Contexts.getMethodContext().set("em", em); //added since DAO 
method access the em via
  |                                                     
//Contexts.lookupInAllStates(or
  |                                                    //     whatever the 
method is called)
  |          if(processXML(record)){
  |          } else {
  |             Transactions.setTransactionRollbackOnly();
  |          }
  |       } catch(Exception ex){
  |          try {
  |             Transactions.setTransactionRollbackOnly();
  |          } catch(Exception e) {
  |             throw new RuntimeException("Could not rollback erred record", 
e);
  |          }
  |       }
  |    }
  |    
  |    </snip rest>
  | }
  | 

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4059235#4059235

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4059235
_______________________________________________
jboss-user mailing list
jboss-user@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to