I see that both geronimo and openejb have jta or non-tx jpa query wrappers that 
close the entity manager after the query executes.  This pretty effectively 
prevents the query from being re-executed.

Despite recalling having written the geronimo version, I can't remember why 
this is necessary.

We've found someone who is doing something like this:

@Stateless
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class Foo implements FooLocal 
{
    @PersistenceContext(unitName="FooJpa", type = 
PersistenceContextType.TRANSACTION) private EntityManager em;
    
    private Query findBars;
    
    @PostConstruct void postConstruct()
    {
            findBars = em.createNamedQuery("findBars");
    }

    public Collection<Bar> getAllBars() {
      return findBars.getResultList();
  }
}

The second time getAllBars() is called, the em is closed.

There are some other errors in their code which might possibly be causing this, 
but I think what is happening is that the postconstruct is executing outside a 
jta transaction, so that the findBars query is a wrapped query that closes 
itself after the query executes, even though it is executing in a jta 
environment.

Should our wrapper only close the em if it is executed (rather than created) 
outside a jta tx?

advice really appreciated :-)

thanks
david jencks


Reply via email to