package org.openbakery.racecontrol.persistence;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
public class DatabasePersistence implements Persistence {
private static Logger log = LoggerFactory.getLogger(DatabasePersistence.class);
private EntityManagerFactory entityManagerFactory;
public DatabasePersistence(String persistence) {
entityManagerFactory = javax.persistence.Persistence.createEntityManagerFactory(persistence);
}
public <T> T store(T object) throws PersistenceException {
log.debug("store: " + object);
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
object = entityManager.merge(object);
transaction.commit();
entityManager.close();
return object;
}
@SuppressWarnings("unchecked")
public List<? extends Object> query(String query) throws PersistenceException {
EntityManager entityManager = entityManagerFactory.createEntityManager();
List<? extends Object> result = entityManager.createQuery(query).getResultList();
entityManager.close();
return result;
}
@SuppressWarnings("unchecked")
public List<? extends Object> queryNative(String query, String name) throws PersistenceException {
EntityManager entityManager = entityManagerFactory.createEntityManager();
List<? extends Object> result = entityManager.createNativeQuery(query, name).getResultList();
entityManager.close();
return result;
}
@SuppressWarnings("unchecked")
public List<? extends Object> queryNamed(String name) throws PersistenceException {
EntityManager entityManager = entityManagerFactory.createEntityManager();
List result = entityManager.createNamedQuery(name).getResultList();
entityManager.close();
return result;
}
public Transaction createTransaction()
{
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
return new Transaction(entityManager, entityTransaction);
}
public void close() throws PersistenceException {
entityManagerFactory.close();
}
public void flush() throws PersistenceException {
}
public List<? extends Object> queryNative(String queryString, Map<String, String> parameters, Class<? extends Object> clazz) throws PersistenceException {
EntityManager entityManager = entityManagerFactory.createEntityManager();
Query query = entityManager.createNativeQuery(queryString, clazz);
for (Map.Entry<String, String> entry : parameters.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
List<? extends Object> result = query.getResultList();
entityManager.close();
return result;
}
public int queryNativeInt(String queryString, Map<String, String> parameters) throws PersistenceException {
EntityManager entityManager = entityManagerFactory.createEntityManager();
Query query = entityManager.createNativeQuery(queryString);
for (Map.Entry<String, String> entry : parameters.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
int result = 0;
Object resultObject = query.getSingleResult();
if (resultObject instanceof Number) {
result = ((Number)resultObject).intValue();
}
entityManager.close();
return result;
}
public <T> T delete(T object) throws PersistenceException {
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Object newObject = entityManager.merge(object);
entityManager.remove(newObject);
transaction.commit();
entityManager.close();
return object;
}
}