【问题标题】:generic get-method for hibernate用于休眠的通用 get 方法
【发布时间】:2013-06-29 08:14:01
【问题描述】:

我正在尝试获取一个通用的 get 方法,以通过休眠的某个 id 从数据库加载对象。在我开始之前,该方法看起来像:

public static Object getObjectFromDatabase(Class c, long id) {
    Transaction newTransaction = getSession().beginTransaction();
    Object result = getSession().get(c, id);

    newTransaction.commit();


    return result;
}

然后我尝试使用以下代码获取通用方法:

public static <T> T getObjectFromDatabase(Class<T> c, long id) {
    Transaction newTransaction = getSession().beginTransaction();
    T result = getSession().get(c, id);

    newTransaction.commit();


    return result;
}

不幸的是这条线

   T result = getSession().get(c, id);

给出错误:类型不匹配:无法从 Object 转换为 T

我知道我可以对 T 使用显式强制转换

   T result = (T) getSession().get(c, id);

但是有没有办法避免这种演员表??

谢谢

【问题讨论】:

    标签: java hibernate generics get


    【解决方案1】:

    否 - Session 中的 get(Class, Serializable) 方法仅声明为返回 Object。它本身不是通用方法,这就是为什么您需要以某种方式进行强制转换的原因。

    不过,您可以使用 Class.cast 方法使演员表更安全:

    T result = c.cast(getSession().get(c, id));
    

    这将在执行时进行正确检查的转换,而不是仅仅进行实际上没有任何作用的“假装”转换。

    【讨论】:

    • 感谢您的回答!这就是我想要的:)
    • 这是有原因的吗?我唯一想到的是 Hibernate 是在 Java 中引入泛型之前创建的。但他们仍然可以添加功能。
    • @h4nek:我不知道,恐怕。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    相关资源
    最近更新 更多