package hamaster.gradesign.idmgmt.impl;
import hamaster.gradesign.idmgmt.CommonDAO;
import java.util.Collection;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.FlushModeType;
import javax.persistence.PersistenceUnit;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
/**
* 提供一个通用接口的默认实现
* @author <a href="mailto:wangyeee@gmail.com">Wang Ye</a>
*/
public abstract class CommonDAOImpl implements CommonDAO {
/**
* 实体管理器
*/
@PersistenceUnit(unitName="ibe")
protected EntityManagerFactory factory;
protected CommonDAOImpl() {
}
/*
* (non-Javadoc)
* @see hamaster.gradesign.idmgmt.CommonDAO#delete(java.lang.Class, java.lang.Object)
*/
@Override
public void delete(Class<?> entityClass, Object primaryKey) {
EntityManager manager = factory.createEntityManager();
EntityTransaction et = manager.getTransaction();
et.begin();
manager.remove(manager.getReference(entityClass, primaryKey));
et.commit();
}
/*
* (non-Javadoc)
* @see hamaster.gradesign.idmgmt.CommonDAO#find(java.lang.Class, java.lang.Object)
*/
@Override
public <T> T find(Class<T> entityClass, Object primaryKey) {
EntityManager manager = factory.createEntityManager();
return manager.find(entityClass, primaryKey);
}
/*
* (non-Javadoc)
* @see hamaster.gradesign.idmgmt.CommonDAO#save(java.lang.Object)
*/
@Override
public void save(Object entity) {
EntityManager manager = factory.createEntityManager();
EntityTransaction et = manager.getTransaction();
et.begin();
manager.persist(entity);
et.commit();
}
/*
* (non-Javadoc)
* @see hamaster.gradesign.idmgmt.CommonDAO#save(java.util.Collection)
*/
@Override
public void batchSave(Collection<?> entities) {
EntityManager manager = factory.createEntityManager();
FlushModeType orig = manager.getFlushMode();
manager.setFlushMode(FlushModeType.COMMIT);
EntityTransaction et = manager.getTransaction();
et.begin();
for (Object entity : entities)
manager.persist(entity);
et.commit();
manager.setFlushMode(orig);
}
/*
* (non-Javadoc)
* @see hamaster.gradesign.idmgmt.CommonDAO#update(java.lang.Object)
*/
@Override
public Object update(Object entity) {
EntityManager manager = factory.createEntityManager();
EntityTransaction et = manager.getTransaction();
et.begin();
Object merge = manager.merge(entity);
et.commit();
return merge;
}
/*
* (non-Javadoc)
* @see hamaster.gradesign.idmgmt.CommonDAO#list(java.lang.Class, int, int)
*/
@Override
public <T> List<T> list(Class<T> entityClass, int page, int amountPerPage) {
EntityManager manager = factory.createEntityManager();
CriteriaBuilder cb = manager.getCriteriaBuilder();
CriteriaQuery<T> query = cb.createQuery(entityClass);
return manager.createQuery(query).
setFirstResult(page * amountPerPage).
setMaxResults(amountPerPage).
getResultList();
}
protected static String getSystemAccessPassword(int systemId) {
// TODO 实现一个从外部读取系统密钥的方法
return "sjdfu838g9n?:{,;[]=-`1-29gyudfugnfdi93990(*dgf^%fgd$&45g*325(";
}
public void setFactory(EntityManagerFactory factory) {
this.factory = factory;
}
}