2016-11-16 46 views
2

我可以一起使用泛型和JPA嗎?使用泛型和jpa EntityManager方法

我試圖堅持四個類的對象到我的分貝。這裏是我的PersistService類:

public class PersistService<T> { 
private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("fileUploadProject"); 

public static EntityManager getEntityManager() { 
    return emf.createEntityManager(); 
} 

// Write Client to Database 
public static <T> void persist(T obj) { 
    EntityManager em = getEntityManager(); 
    EntityTransaction et = em.getTransaction(); 
    et.begin(); 
    em.persist(obj); 
    et.commit(); 
    em.close(); 
} 
} 

但是隨後我遇到了一個刪除對象的問題。我除了上述的PersistService類下面的方法:

// Remove an object from the Database if they exist 
public static <T> void remove(Long id) { 
    EntityManager em = getEntityManager(); 
    EntityTransaction et = em.getTransaction(); 
    <T> obj = em.find(<T>.class, id); 
} 

最後一行是給我一個編譯時錯誤。我試過<T>.classTClass<T>T.class,但它仍然給我一個編譯時錯誤。剛剛瞭解Type Erasure,是因爲這個錯誤嗎?我該如何解決這個問題?

+0

你應該儘量讓GenericDao,使子類擴展它 – BrunoDM

+0

你永遠要在你的'PersistService'方法所管理的事務。您想基於業務邏輯的邏輯塊來管理事務邊界。通常情況下,您將執行多個數據庫操作,要麼全部成功,要麼全部失敗 - 否則系統將處於不易編碼且難以恢復的不一致狀態。 – Rob

+0

編譯期間無法獲得類類型。你會花費足夠的時間和資源來尋找它。 –

回答

2

您已經開始使用良好的模式。下一步是爲每個實體類型創建PersistService的子類。我還會提到,從長遠來看,您可能希望爲每個實體設置一個通用的基類或接口。例如,我將其稱爲Entity。這個基類(如果它是一個類而不是接口)可以是抽象的,並且可以爲所有實體定義通用方法。

public interface Entity { 
    long getId(); 
} 

(如你在這個基礎服務在你的代碼添加更多的通用實體相關的業務邏輯或其他地方,你可能會發現方便),您可以使用Entity在實施PersistService定義的方法。

你的實體A看起來像

public class A extends Entity { 
} 

PersistService成爲

public abstract class PersistService<T extends Entity> { 
    // Your common methods (persist, remove, etc.). 
    public abstract Class<T> getEntityClass(); 
} 

您的特定實體的服務看起來像這樣

public class APersistService extends PersistService<A> { 
    public Class<A> getEntityClass() { 
     return A.class; 
    } 
} 

然後使用getEntityClass()方法,當你實現PersistService.remove()

儘管特定於實體的子類解決了在類型擦除中獲取特定類對象的問題,但您會發現最終希望子類也支持特定於實體的查詢。

0

我可能有你正在尋找的答案,以及在編譯期間使用泛型類型並不容易。由於Java不允許你直接這樣做。

我有一個黑客自己,你可以嘗試這樣的事情嗎?

請務必處理您的例外。

static <T> Class getGenericType(T t){ 
    return getType(t); 
} 
static Class<?> getType(Object o){ 
    return o.getClass(); 
}