Jersey, Guice e Hibernate - EntityManager hilo de seguridad

He usado este tutorial de la misma manera en mi aplicación:http://www.benmccann.com/hibernate-with-jpa-annotations-and-guice/

Mi aplicación es el servicio web JAX-RS que recibirá muchas solicitudes concurrentes y realizará actualizaciones en la base de datos.

Implementación de GenericDAOImpl.java:

public class GenericDAOImpl<T> implements GenericDAO<T> {

    @Inject
    protected EntityManager entityManager;

    private Class<T> type;

    public GenericDAOImpl(){}

    public GenericDAOImpl(Class<T> type) {
        this.type = type;
    }

    @Override
    public void save(T entity) {
        entityManager.getTransaction().begin();
        entityManager.persist(entity);
        entityManager.getTransaction().commit();
    }

}

Si 2 hilos concurrentes intentan salvar la entidad, obtengo

java.lang.IllegalStateException: Transaction already active

El ahorro funciona bien si comento una transacción.

He intentado usar

@Inject
protected Provider<EntityManager> entityManagerProvider;

o

@Inject
protected EntityManagerFactory entityManagerProvider;

y para cada solicitud:

EntityManager entityManager = entityManagerProvider.get()

Pero luego me sale:

org.hibernate.PersistentObjectException: detached entity passed to persist

¿Cuál es la forma correcta de implementar Guice + Hibernate EntityManager inyección / clase genérica DAO segura para subprocesos?

ACTUALIZAR

Andrew Rayner comentario dehttp://www.benmccann.com/hibernate-with-jpa-annotations-and-guice/

"La lógica no está realmente preparada para la producción, al menos si se usa en una aplicación web.

El grupo de conexiones de Hibernates es muy básico y no está listo para la producción; la recomendación es utilizar un grupo de fuentes de datos como c3p0.

EntityManager no debe reutilizarse, está diseñado para crearse por transacción / solicitud. Hay una buena posibilidad de contaminar las solicitudes posteriores.

Tampoco hay reversión de transacciones si algo sale mal.

Un enfoque interesante, pero sería mucho más seguro para las aplicaciones web usar el módulo de extensión Persist propio de Guices para administrar el ciclo de vida de las instancias y transacciones de EntityMananger ".

Respuestas a la pregunta(3)

Su respuesta a la pregunta