測試用的 GeneralEAO, EntityManagerHelper
雖然不知道這樣算不算 GeneralEAO, 不過這兩個 class 已經寫好幾次拿來做測試了, 很方便用.
到後來乾脆直接摳來摳去, 反正要測試的時候就可以用, 看習慣.
因為很方便, 所以記一下, 不用以後又重寫. 順便如果有不足的再改.
首先是 ThreadLocal 的 EntityManagerHelper
public class EntityManagerHelper {
private static final ThreadLocal<EntityManager> threadLocal = new ThreadLocal<EntityManager>();
private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
public static EntityManager getEntityManager() {
EntityManager em = threadLocal.get();
if ( em == null ) {
em = emf.createEntityManager();
threadLocal.set(em);
}
return em;
}
}
然後是 GeneralEAO, 這裡 transactionCommit 另外放是因為可以做很多事情之後再一次進 DB.
public class GeneralEAO {
public static <T> void create(T t) {
EntityManagerHelper.getEntityManager().persist(t);
}
public static <T> T find(Class<? extends T> cls, Object key) {
return (T) EntityManagerHelper.getEntityManager().find(cls, key);
}
public static <T> void update(T t) {
EntityManagerHelper.getEntityManager().merge(t);
}
public static <T> void update(Query q) {
EntityManager em = EntityManagerHelper.getEntityManager();
em.getTransaction().begin();
q.executeUpdate();
em.getTransaction().commit();
}
public static <T> void delete(T t) {
EntityManager em = EntityManagerHelper.getEntityManager();
em.remove( em.merge(t) );
}
public static <T> T undo(T t) {
EntityManager em = EntityManagerHelper.getEntityManager();
t = em.merge(t);
em.refresh( t );
return t;
}
public static Query namedQuery(String name) {
return EntityManagerHelper.getEntityManager().createNamedQuery(name);
}
public static Query query(String queryString) {
return EntityManagerHelper.getEntityManager().createQuery(queryString);
}
public static void detachAll() {
EntityManagerHelper.getEntityManager().clear();
}
public static <T> void transactionCommit() {
EntityManager em = EntityManagerHelper.getEntityManager();
em.getTransaction().begin();
em.getTransaction().commit();
}
}
Posted at 12:53上午 八月 21, 2008 by shooeugenesea in EJB3 | 迴響[0]