JPA generic DAO package

EntityManager object in the Web container, need to do some improvements can be safer. Servlet is not thread-safe, so it is necessary to change the EntityManager object ThreadLocal class.
ThreadLocal is to use a variable for each thread to provide a copy of the value of the variable, so that each thread can independently change their copy, without conflict and a copy of the other threads. From the point of view of the thread, as if each thread in full possession of one of the variables, which would address the problem of the the servlet non-thread-safe.

The following EntityManager object of non-container EJB container-managed manual control transaction. Can be used in a Java SE environment. EJB container management, or Web container can be injected directly into the @ PersistenceContext use JTA Affairs Management in RESOURCE_LOCAL.

view plainprint?
  1. import java.io.Serializable;
  2. import java.util.Collection;
  3. import java.util.List;
  4. /**
  5. *
  6. * <p>Title: </p>
  7. * <p>Description:EasyJWeb ToolsDAO </p>
  8. * <p>Copyright: Copyright (c) 2006</p>
  9. * <p>Company: EasyJF</p>
  10. * @author 
  11. * @version 0.1
  12. */
  13. public interface IDAO<T> {
  14.     /**
  15.      * 
  16.      * 
  17.      * @param obj
  18.      * @return ?true?false
  19.      * @throws IdExistException
  20.      */
  21.     boolean save(T obj);
  22.     /**
  23.      * 
  24.      * 
  25.      * @param obj
  26.      * @return ?true?false
  27.      */
  28.     boolean update(T obj);
  29.     /**
  30.      * 
  31.      * 
  32.      * @param obj
  33.      * @return ?true?false
  34.      */
  35.     boolean del(T obj);
  36.     /**
  37.      * 
  38.      * 
  39.      * @param clz
  40.      * @param id
  41.      * @return ??null
  42.      */
  43.     T get(Class<T> clz, Serializable id);
  44.     /**
  45.      * ???
  46.      * 
  47.      * @param clz
  48.      * @param fieldName
  49.      * @param value
  50.      * @return ??null
  51.      */
  52.     T getBy(Class<T> clz, String fieldName, Serializable value);
  53.     /**
  54.      * 
  55.      * 
  56.      * @param clz 
  57.      * @param scope 
  58.      * @return 
  59.      */
  60.     List<T> query(Class<T> clz, String scope);
  61.     /**
  62.      * ?
  63.      * 
  64.      * @param clz 
  65.      * @param scope 
  66.      * @param paras 
  67.      * @return 
  68.      */
  69.     List<T> query(Class<T> clz, String scope, Collection paras);
  70.     /**
  71.      * ?beginmax
  72.      * 
  73.      * @param clz Java
  74.      * @param scope 
  75.      * @param paras 
  76.      * @param begin 
  77.      * @param max  
  78.      * @return 
  79.      */
  80.     List<T> query(Class<T> clz, String scope, Collection paras, int begin, int max);
  81.     /**
  82.      * sql?,select count(*) from tableName
  83.      * @param sql sql
  84.      * @return ?null
  85.      */
  86.     Object uniqueResult(String sql);
  87.     /**
  88.      * sql??select count(*) from tableName where filed=?
  89.      * @param sql
  90.      * @param paras
  91.      * @return ?null
  92.      */
  93.     Object uniqueResult(String sql,Collection paras);
  94.     /**
  95.      * sql?
  96.      * @param sql sql
  97.      * @return 
  98.      */
  99.     int execute(String sql);
  100.     /**
  101.      * sql?
  102.      * @param sql sql
  103.      * @param paras 
  104.      * @return 
  105.      */
  106.     int execute(String sql,Collection paras);
  107. }

***********************************************

***********************************************

view plainprint?
  1. import java.io.Serializable;
  2. import java.util.Collection;
  3. import java.util.List;
  4. import javax.persistence.EntityManager;
  5. import javax.persistence.EntityManagerFactory;
  6. import javax.persistence.Query;
  7. public class EntityMangerDaoSurport<T> implements IDAO<T> {
  8.     private static EntityManagerFactory emf;
  9.     private static ThreadLocal<EntityManager> em;
  10.     public EntityManager getEntityManager() {
  11.         EntityManager manager = em.get();
  12.         if (manager == null) {
  13.             manager = emf.createEntityManager();
  14.             em.set(manager);
  15.         }
  16.         return manager;
  17.     }
  18.     public boolean del(Object obj) {
  19.         getEntityManager().getTransaction().begin();
  20.         if (!getEntityManager().contains(obj))
  21.             obj = getEntityManager().merge(obj);
  22.         getEntityManager().remove(obj);
  23.         getEntityManager().getTransaction().commit();
  24.         return true;
  25.     }
  26.     public int execute(String sql) {
  27.         return execute(sql, null);
  28.     }
  29.     public int execute(String sql, Collection paras) {
  30.         Query query = getEntityManager().createNativeQuery(sql);
  31.         int parameterIndex = 0;
  32.         if (paras != null && paras.size() > 0) {
  33.             for (Object obj : paras) {
  34.                 query.setParameter(parameterIndex++, obj);
  35.             }
  36.         }
  37.         return query.executeUpdate();
  38.     }
  39.     public T get(Class<T> clz, Serializable id) {
  40.         return getEntityManager().find(clz, id);
  41.     }
  42.     public T getBy(Class<T> clz, String fieldName, Serializable value) {
  43.         Query query = getEntityManager().createQuery(
  44.                 “from “ + clz + ” where fieldName=?”);
  45.         query.setParameter(0, value);
  46.         return (T) query.getSingleResult();
  47.     }
  48.     public List query(Class clz, String scope) {
  49.         return query(clz, scope, null);
  50.     }
  51.     public List query(Class clz, String scope, Collection paras) {
  52.         return query(clz, scope, null, -1, -1);
  53.     }
  54.     public List query(Class clz, String scope, Collection paras, int begin,
  55.             int max) {
  56.         Query query = getEntityManager().createQuery(
  57.                 “from “ + clz + ” where “ + scope);
  58.         int parameterIndex = 0;
  59.         if (paras != null && paras.size() > 0) {
  60.             for (Object obj : paras) {
  61.                 query.setParameter(parameterIndex++, obj);
  62.             }
  63.         }
  64.         if (begin >= 0 && max > 0) {
  65.             query.setFirstResult(begin);
  66.             query.setMaxResults(max);
  67.         }
  68.         return query.getResultList();
  69.     }
  70.     public boolean save(Object obj) {
  71.         getEntityManager().getTransaction().begin();
  72.         getEntityManager().persist(obj);
  73.         getEntityManager().getTransaction().commit();
  74.         return true;
  75.     }
  76.     public Object uniqueResult(String sql) {
  77.         return uniqueResult(sql, null);
  78.     }
  79.     public Object uniqueResult(String sql, Collection paras) {
  80.         Query query = getEntityManager().createQuery(sql);
  81.         int parameterIndex = 0;
  82.         if (paras != null && paras.size() > 0) {
  83.             for (Object obj : paras) {
  84.                 query.setParameter(parameterIndex++, obj);
  85.             }
  86.         }
  87.         return query.getSingleResult();
  88.     }
  89.     public boolean update(Object obj) {
  90.         getEntityManager().getTransaction().begin();
  91.         getEntityManager().merge(obj);
  92.         getEntityManager().getTransaction().commit();
  93.         return true;
  94.     }
  95. }

Not everyone can be formulated as a standard, but everyone has the right to the pursuit of standards and beyond the standard! !