我正在尝试使用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进行静态引用
答案 0 :(得分: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;
}
}
答案 1 :(得分: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);