package net.csdn.jpa.context;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import java.util.Map;
/**
* BlogInfo: WilliamZhu
* Date: 12-6-26
* Time: 下午9:19
*/
public class JPAConfig {
private final String configName;
private EntityManagerFactory entityManagerFactory = null;
private ThreadLocal<JPAContext> local = new ThreadLocal<JPAContext>();
public JPAConfig(Map<String, String> _properties, String _configName) {
this.configName = _configName;
entityManagerFactory = Persistence.createEntityManagerFactory(configName, _properties);
}
public String getConfigName() {
return configName;
}
protected void close() {
if (isEnabled()) {
try {
entityManagerFactory.close();
} catch (Exception e) {
// ignore it - we don't care if it failed..
}
entityManagerFactory = null;
}
}
/**
* @return true 如果 entityManagerFactory 已经启动
*/
public boolean isEnabled() {
return entityManagerFactory != null;
}
public EntityManager newEntityManager() {
return entityManagerFactory.createEntityManager();
}
public JPAContext getJPAContext() {
JPAContext context = local.get();
//因为是本地线程的,所以没必要担心多线程问题
if (context == null) {
context = new JPAContext(this);
local.set(context);
}
return context;
}
/*
@return old jpacontext
*/
public JPAContext reInitJPAContext() {
JPAContext oldContext = local.get();
local.set(new JPAContext(this));
return oldContext;
}
public void setJPAContext(JPAContext jpaContext) {
local.set(jpaContext);
}
public boolean threadHasJPAContext() {
return local.get() != null;
}
protected void clearJPAContext() {
JPAContext context = local.get();
if (context != null) {
try {
context.close();
} catch (Exception e) {
// Let's it fail
}
local.remove();
}
}
}