2

Hibernate を使用して CRUD システムを構築しようとしています。すべての DB オブジェクトのインターフェースを構築したい:

public abstract class ADBElem { }

DB オブジェクトメソッド (読み取り) の例を次に示します。

public static PrdProduct read(Integer id) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    PrdProduct product = null;
    product = (PrdProduct) session.get(PrdProduct.class, id);
    session.close();
    return product;
}

戻り値の型は継承されたクラスによって異なります。このメソッドを抽象クラスに配置するにはどうすればよいですか?

これまでに見つけたもの:

public abstract class ADBElem<T> {
    public static T read(Integer id) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    T item = null;
    item = (T) session.get(T.class, id);
    session.close();
    return item;
 }

public class PrdProduct extends ADBElem<PrdProduct> {} 

しかし、それは機能していません。私はこのエラーを受け取りました: 非静的型 t への静的参照を作成できません

4

2 に答える 2

2

PrdProduct抽象クラスでは、スーパークラスまたはそれによって実装されたインターフェイスである戻り値の型を持つメソッド シグネチャを追加する必要があります。次に、具体的なメソッドは、具体的な型に関係なく、同じ抽象型を返す必要があります。

public abstract class ADBElem { 
    public static SomeSuperCLass read(Integer id);
}

public class PrdProduct extends SomeSuperCLass {
    public static SomeSuperCLassOrInterface read(Integer id) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        PrdProduct product = null;
        product = (PrdProduct) session.get(PrdProduct.class, id);
        session.close();
        // return product which is also a `SomeSuperClass`
        return product;
    }
}
于 2012-10-16T23:17:25.083 に答える
1

静的(ユーティリティ)メソッドを使用すると、メソッドだけを入力できます。ただし、ジェネリック型を取得する方法はないため、オブジェクトもClass渡す必要があります。Class

静的メソッドとして機能するようにコーディングする方法は次のとおりです(クラスが入力されているかどうかに関係なく)。

public static <T> T read(Integer id, Class<T> clazz) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    T object = (T) session.get(clazz, id);
    session.close();
    return object;
}

使用すると、javaは型を推測するため、次のように呼び出しを(キャストなしで)簡単にコーディングできます。

PrdProduct product = MyClass.read(1, PrdProduct.class);
于 2012-10-16T23:57:44.700 に答える