2010-11-17 19 views
3

Spring 3.0增加了很多與Java 5兼容的功能。現在有很多方法被參數化。 例如HibernateTemplate.executeXXX()HibernateTemplate.getXXX(), HibernateTemplate.mergeXXX() return T, HibernateTemplate.loadAll()返回List<T>爲什麼在HibernateTemplate中findXXX()方法返回非參數化列表?

findXXX()方法返回普通List,所以我必須把它投到像List<MyEntity>

有人知道是什麼原因嗎?爲什麼找到方法沒有參數化?或者可能還有其他的參數化API?

這是我在做什麼。

這是spring.xml的相關部分:

<bean id="hibernateInterceptor" class="org.springframework.orm.hibernate3.HibernateInterceptor" autowire="byName" /><!--sessionFactory will get autowired--> 

    <bean id="deviceDaoTarget" class="com.nso.solution.dao.DeviceDAOHibernateImpl" autowire="byName" /><!--sessionFactory will get autowired--> 

    <bean id="discoveryDAO" class="org.springframework.aop.framework.ProxyFactoryBean"> 
    <property name="proxyInterfaces"> 
     <value>com.nso.solution.dao.DeviceDAO</value> 
    </property> 
    <property name="interceptorNames"> 
     <list> 
     <value>hibernateInterceptor</value> 
     <value>deviceDaoTarget</value> 
     </list> 
    </property> 
    </bean> 

DeviceDAO是包含多種方法,使檢索,保存和刪除的對象的接口。 DeviceDAOHibernateImpl實現這個接口,例如我不得不使用@SuppressWarnings(「unchecked」)註釋標記此方法。因爲它是在春季3 棄用

回答

5

春天沒有更新的HibernateTemplate(見Classic Spring Usage: Hibernate

Spring suggests a simpler usage of Hibernate,不配合的應用程序代碼到Spring框架。

基本上是:注入SessionFactory,使用@Transactional做普通休眠編碼而Spring會自動創建並提交交易:

@Transactional 
public class ProductDaoImpl implements ProductDao { 

    private SessionFactory sessionFactory; 

    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    @SuppressWarnings("unchecked") 
    public Collection<Product> loadProductsByCategory(String category) { 
     return this.sessionFactory.getCurrentSession() 
       .createQuery(
        "from test.Product product where product.category=?") 
       .setParameter(0, category) 
       .list(); 
    } 
} 

更新:這是Spring的示例代碼,不是我的,但我把它改爲返回一個通用集合。不需要鑄造。 (但你必須自己強制類型安全,編譯器也幫不了你)

+1

謝謝您的回覆。不幸的是我不明白它對我有什麼幫助。您的解決方案仍然會返回純收集並處理較低級別的API。 – AlexR 2010-11-17 12:40:07

+0

無論如何感謝您的參考,你發送。我正在閱讀這些文件,希望我能很快理解要做什麼。 – AlexR 2010-11-17 12:43:35

+0

這不是我的解決方案,它是Spring的示例代碼。不,它不處理較低級別的API,Spring創建,自動關閉並提交事務和會話,您只需調用getCurrentSession() – 2010-11-17 12:53:03

0

我將與上述UND SessionFactory的例子去把它擴展到

public List<T> findByCriteria(Class<T> persistentClass, Criterion... criterion) { 
    Criteria crit = getSessionFactory().getCurrentSession().createCriteria(persistentClass); 
    for (Criterion c : criterion) { 
     crit.add(c); 
    } 
    return crit.list(); 
} 

,如果你想一切都只是使用它沒有判據行

0

問題是Hibernate的人不想在Hibernate API中使用泛型。據我所知,他們的觀點是他們不希望強制Java 1.4人員切換到1.5。 HibernateTemplate不會將搜索結果轉換爲參數化類型,以便與原始(非泛型)Hibernate API保持一致。

相關問題