2016-11-16 11 views
2

ジェネリックスとJPAを一緒に使用できますか?ジェネリックスとJPA EntityManagerメソッドの使用

私は4つのクラスのオブジェクトをデータベースに永続化しようとしています。ここに私の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も試しましたが、コンパイル時にエラーが出ます。タイプ消去について学ぶだけで、このエラーはそれですか?この問題を解決するにはどうすればよいですか?

+0

あなたはGenericDaoを作成し、子クラスは、あなたがあなたの 'PersistService'方法で管理されているトランザクションを持つようにしたいことはありません – BrunoDM

+0

それを拡張するために試してみてください。ビジネスロジックの論理チャンクに基づいてトランザクションの境界を管理したいとします。通常、成功するか、すべて失敗するかを数多くのデータベース操作で行います。そうしないと、システムはコード化が難しく、回復が困難な不整合な状態になります。 – Rob

+0

コンパイル時にクラスの型を取得することはできません。あなたはそれを探し出すのに十分な時間と資源を費やします。 –

答えて

2

良いパターンの使用を開始しました。次のステップでは、エンティティタイプごとにPersistServiceのサブクラスを作成します。長期的には、エンティティごとに共通の基本クラスまたはインタフェースを用意したいとも言います。たとえば、私はそれをEntityと呼びます。この基本クラス(インタフェースではなくクラスの場合)は抽象クラスでもよく、すべてのエンティティに共通のメソッドを定義できます。 (あなたのコードの別の場所で、この基本サービスでは、より汎用的なエンティティに関連するビジネスロジックを追加するかのようにあなたが便利かもしれません)

public interface Entity { 
    long getId(); 
} 

あなたはPersistServiceの実装にEntityによって定義されたメソッドを使用することができます。

public class A extends Entity { 
} 

あなたPersistServiceはあなたの企業固有のサービスは、あなたが実装するときは、その後、getEntityClass()メソッドを使用して、この

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

ように見える

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

なりのようにあなたのエンティティAが見えますPersistService.remove()

エンティティ固有のサブクラスは、タイプ消去の面で特定のクラスオブジェクトを取得する問題を解決しますが、サブクラスでエンティティ固有のクエリもサポートされるようになります。

0

あなたが探している答えがあるかもしれませんが、よくコンパイル時にジェネリック型を持つのは簡単ではありません。以来、javaはあなたが直接行うことを許可していません。

私自身がハッキングしていますが、このようなことを試すことができますか?

例外を処理するようにしてください。

static <T> Class getGenericType(T t){ 
    return getType(t); 
} 
static Class<?> getType(Object o){ 
    return o.getClass(); 
} 
関連する問題