Почему методы findXXX () в HibernateTemplate возвращают непараметризованный список? - PullRequest
3 голосов
/ 17 ноября 2010

Spring 3.0 добавил множество функций для совместимости с Java 5.Многие методы теперь параметризованы.Например, HibernateTemplate.executeXXX(), HibernateTemplate.getXXX(), HibernateTemplate.mergeXXX() return 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").

Ответы [ 3 ]

5 голосов
/ 17 ноября 2010

Spring не обновил HibernateTemplate, поскольку в Spring 3 он устарел. (См. Classic Spring Использование: Hibernate )

Spring предлагает более простое использование Hibernate , которое не привязывает код приложения к Spring Framework.

В основном: внедрить 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, а не мой, но я изменил его, чтобы вернуть универсальную коллекцию. Кастинг не требуется. (Но вы должны сами обеспечивать безопасность типов, компилятор не может вам помочь)

0 голосов
/ 18 ноября 2010

Дело в том, что ребята из Hibernate не хотят использовать дженерики в Hibernate API.Насколько я знаю, их аргумент в том, что они не хотят заставлять людей Java 1.4 переключаться на 1.5.HibernateTemplate не преобразует результаты поиска в параметризованный тип, чтобы соответствовать первоначальному (не универсальному) Hibernate API.

0 голосов
/ 17 ноября 2010

Я бы пошел с приведенным выше примером сессионного завода и расширил бы его до

    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();
}

, просто используйте его без критериев, если вы хотите, чтобы все строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...