2

我正在尝试使用 Hibernate 构建一个 CRUD 系统。我想为我的所有数据库对象构建一个接口:

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

使用静态(实用程序)方法,您可以只键入 method。但是,没有办法获取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 回答