package com.softwaremill.common.cdi.persistence; import javax.enterprise.context.RequestScoped; import javax.enterprise.inject.Disposes; import javax.enterprise.inject.Produces; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; /** * @author Adam Warski (adam at warski dot org) */ public class EntityManagerProducer { @Inject private EntityManagerFactory entityManagerFactory; @Produces @RequestScoped @Writeable public EntityManager getEntityManager() { EntityManager entityManager = entityManagerFactory.createEntityManager(); return new EntityManagerTxEnlistDecorator(entityManager); } @Produces @RequestScoped @ReadOnly public EntityManager getReadOnlyEntityManager() { EntityManager readOnlyEntityManager = entityManagerFactory.createEntityManager(); EntityManagerUtil.makeEntityManagerReadOnly(readOnlyEntityManager); return new EntityManagerTxEnlistDecorator(readOnlyEntityManager); } public void disposeOfReadOnlyEntityManager(@Disposes @ReadOnly EntityManager readOnlyEntityManager) { if (readOnlyEntityManager.isOpen()) { readOnlyEntityManager.close(); } } public void disposeOfWriteableEntityManager(@Disposes @Writeable EntityManager writeableEntityManager) { if (writeableEntityManager.isOpen()) { writeableEntityManager.close(); } } }