package org.aksw.sparqlify.admin.web.common;
import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
/**
*
* TODO Maybe rather then doing a direct save, the request should be delegated to a parent container
*
* @author raven
*
* @param <T>
*/
public class EntityHolderJpa<T>
implements EntityHolder<T>
{
private EntityManagerFactory emf;
private EntityManager em = null;
private Class<T> clazz;
private Serializable id;
private T entity;
public EntityHolderJpa(EntityManagerFactory emf, Class<T> clazz, Serializable id) {
this.emf = emf;
this.clazz = clazz;
this.id = id;
this.entity = null;
}
public T getEntity() {
return entity;
}
public void openSession() {
if(em != null) {
throw new RuntimeException("Session is already open");
}
em = emf.createEntityManager();
em.getTransaction().begin();
entity = em.find(clazz, id);
if(entity == null) {
throw new RuntimeException("Instance with id " + id + " of entity " + clazz.getName() + " not found");
}
}
public void commit() {
if(em == null) {
throw new RuntimeException("No session was openend");
}
// EntityManager em = emf.createEntityManager();
// em.getTransaction().begin();
em.merge(entity);
// TODO This flush is probably superfluous
em.flush();
em.getTransaction().commit();
em.close();
em = null;
entity = null;
}
}