java - 为什么 HibernateTemplate 中的 findXXX() 方法返回非参数化列表?

标签 java hibernate spring generics

Spring 3.0 添加了很多与 java 5 兼容的特性。现在很多方法都参数化了。 例如HibernateTemplate.executeXXX() , HibernateTemplate.getXXX() , HibernateTemplate.mergeXXX()返回 T, HibernateTemplate.loadAll()返回 List<T> .

但是findXXX()方法返回普通 List , 所以我必须把它转换成类似 List<MyEntity> 的东西.

有人知道是什么原因吗?为什么 find 方法没有参数化?或者可能还有其他参数化的 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 是一个接口(interface),包含多个允许检索、保存和删除对象的方法。 DeviceDAOHibernateImpl 实现了这个接口(interface),例如

public List<Device> getAllDevices() {
    return getHibernateTemplate().loadAll(Device.class);
}

我必须用@SuppressWarnings("unchecked") 注解来标记这个方法。

最佳答案

Spring 没有更新 HibernateTemplate 因为它在 Spring 3 中被弃用了。 (参见 Classic Spring Usage: Hibernate)

Spring suggests a simpler usage of Hibernate ,这不会将应用程序代码绑定(bind)到 Spring 框架。

基本上:注入(inject)一个 SessionFactory,使用 @Transactional 并在 Spring 自动创建和提交事务时进行简单的 hibernate 编码:

@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 的示例代码,不是我的,但我将其更改为返回一个通用集合。无需类型转换。 (但是你必须自己强制类型安全,编译器帮不了你)

关于java - 为什么 HibernateTemplate 中的 findXXX() 方法返回非参数化列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4204233/

相关文章:

java - hibernate 锁定模式/锁定选项

spring - 自定义 http 安全配置以及 OAuth2 资源服务器

java - Simple HashSet 包含误解

java - 用于联系人列表的 Hibernate Pojo 设计

java - eclipse helios : tomcat project - jar will not be exported or published. runtime ClassNotFoundExceptions 可能会导致

java - hibernate 错误: Method too large (exceeding 65535 bytes size)

java - AspectJ @Before 注释问题

java - 如果我通过 ApplicationContext getBean 方法检索它,则在非托管 Spring 类中获取一个 bean 实例

java - GAE-J中标注系统的设计

java - 对话框未从 EditText 框中提取信息