package net.csdn.jpa.context;
import net.csdn.jpa.model.JPQL;
import javax.persistence.EntityManager;
import javax.persistence.FlushModeType;
import javax.persistence.PersistenceException;
/**
* BlogInfo: WilliamZhu
* Date: 12-6-26
* Time: 下午9:21
* 任何一个线程都都会含有一个JPAContext
*/
public class JPAContext {
private JPAConfig jpaConfig;
private EntityManager entityManager;
protected JPAContext(JPAConfig jpaConfig) {
this.jpaConfig = jpaConfig;
EntityManager manager = jpaConfig.newEntityManager();
manager.setFlushMode(FlushModeType.COMMIT);
//manager.setProperty("org.hibernate.readOnly", readonly);
//默认都提供事物支持
manager.getTransaction().begin();
entityManager = manager;
}
public JPAConfig getJPAConfig() {
return jpaConfig;
}
public JPQL jpql() {
return new JPQL(this);
}
public JPQL jpql(String entity) {
return new JPQL(this, entity);
}
public void closeTx(boolean rollback) {
try {
if (entityManager.getTransaction().isActive()) {
if (rollback || entityManager.getTransaction().getRollbackOnly()) {
entityManager.getTransaction().rollback();
} else {
try {
entityManager.getTransaction().commit();
} catch (Throwable e) {
for (int i = 0; i < 10; i++) {
if (e instanceof PersistenceException && e.getCause() != null) {
e = e.getCause();
break;
}
e = e.getCause();
if (e == null) {
break;
}
}
throw new RuntimeException("Cannot commit", e);
}
}
}
} finally {
entityManager.close();
//clear context
jpaConfig.clearJPAContext();
}
}
protected void close() {
entityManager.close();
}
public EntityManager em() {
return entityManager;
}
public void setRollbackOnly() {
entityManager.getTransaction().setRollbackOnly();
}
public int execute(String query) {
return entityManager.createQuery(query).executeUpdate();
}
public boolean isInsideTransaction() {
return entityManager.getTransaction() != null;
}
}