JPA Transactional Proxy for JavaSE

2011-11-03

When using JPA in Java SE, it would still be helpful if a proxy would take care of the transactions and EntityManager life-cycle. I have created such a proxy for my Java/JPA and thought that perhaps others would like to use it as well. Here is some client code using it

Foo f = JPAUtil.getTransactionalProxy(Foo.class);
f.bar();

The bar method can then be implemented like this

public void bar(){
  EntityManager em = JPAUtil.getEntityManager();
  ...
  em.persist(someObject);
}

The JPAUtil is used to create the proxy and to obtain the EntityManager. The proxy is created using javassist

It creates an JPA transactional proxy with following semantics:

  • Shares an EntityManager per thread
  • Opens and closes the entityManager for each method call
  • Transaction follow REQUIRED pattern (will join an existing transaction)
  • Uses the rollback only flag on the Transaction object
  • Rolls-back on «any» exception

This implementation does not inject the EntityManager into the target object

The whole code can be downloaded as a gist

This article does not necessarily reflect the technical opinion of EDC4IT, but purely of the writer. If you want to discuss about this content, please use thecontact ussection of the site