package io.trygvis.persistence.sql; import javax.persistence.Cache; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.PersistenceException; import javax.persistence.PersistenceUnitUtil; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.metamodel.Metamodel; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; import java.util.Map; import static java.util.Collections.emptyMap; public abstract class SqlEntityManagerFactory implements EntityManagerFactory { public final SqlUnit sqlUnit; private final DataSource dataSource; protected SqlEntityManagerFactory(SqlUnit sqlUnit, DataSource dataSource) { this.sqlUnit = sqlUnit; this.dataSource = dataSource; } // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- protected abstract EntityManager createEntityManager(Connection c); // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- @Override public EntityManager createEntityManager() { return createEntityManager(emptyMap()); } @Override public EntityManager createEntityManager(Map map) { try { Connection c = dataSource.getConnection(); return createEntityManager(c); } catch (SQLException e) { throw new PersistenceException("Could not get connection", e); } } @Override public CriteriaBuilder getCriteriaBuilder() { throw new UnsupportedOperationException(); } @Override public Metamodel getMetamodel() { throw new UnsupportedOperationException(); } @Override public boolean isOpen() { return true; } @Override public void close() { } @Override public Map getProperties() { return emptyMap(); } @Override public Cache getCache() { return new NoOpCache(); } @Override public PersistenceUnitUtil getPersistenceUnitUtil() { throw new UnsupportedOperationException(); } private static class NoOpCache implements Cache { @Override public boolean contains(Class cls, Object primaryKey) { return false; } @Override public void evict(Class cls, Object primaryKey) { } @Override public void evict(Class cls) { } @Override public void evictAll() { } } }