Spring 3.0增加了很多兼容java 5的功能。现在许多方法都是参数化的。
例如HibernateTemplate.executeXXX()
,HibernateTemplate.getXXX()
,HibernateTemplate.mergeXXX()
返回T,
HibernateTemplate.loadAll()
会返回List<T>
。
但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实现了这个接口,例如
public List<Device> getAllDevices() {
return getHibernateTemplate().loadAll(Device.class);
}
我必须使用@SuppressWarnings(“unchecked”)注释标记此方法。
答案 0 :(得分:5)
Spring没有更新HibernateTemplate,因为它在Spring 3中已被弃用。 (见Classic Spring Usage: Hibernate)
Spring suggests a simpler usage of Hibernate,它不会将应用程序代码绑定到Spring Framework。
基本上:注入SessionFactory
,使用@Transactional
并执行简单的hibernate编码,而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 :(得分:0)
我会使用上面的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();
}
如果你想要所有行,只需使用它而不使用Criterions
答案 2 :(得分:0)
问题是Hibernate的人不想在Hibernate API中使用泛型。据我所知他们的论点是他们不希望强制Java 1.4人切换到1.5。 HibernateTemplate
不会将搜索结果转换为参数化类型,以便与原始(非通用)Hibernate API保持一致。