Given: simple JSF webapp (no Seam), having JSF beans calling few EJB's which in turn load and persist JPA entities. What I want to is to use @Singleton
annotation for ejb's and inject EntityManager
instead of EntityManagerFactory
:
@Singleton
public class MyEJB {
@PersistenceContext(unitName = PERSISTENCE_UNIT_NAME)
protected EntityManager em; // not EntityManagerFactory
}
Spec says that @Singleton
is thread-safe, supports concurrency and transaction attributes which (from my pov) makes it safe for calling from JSF beans. I expect also performance benefits because of EntityManager
not being recreated for each call and it's internal caching abilities.
My main concern here is create/update operations on JPA entities in the situation when I have several singletons and, as a result, the same count of long-living EntityManagers.
- What happens if one singleton updates an JPA instance and how these changes are populated to other singletons?
- As I'm not able to close entity manager, do I need to flush it upon each entity update?
- Would it be better if these few singletons will share the same entity manager?
- I saw only few examples of such design. Why? Are there any serious drawbacks?
Many thanks in advance!