2010-11-17 6 views
3

Spring 3.0 a ajouté beaucoup de fonctionnalités pour être compatible avec Java 5. De nombreuses méthodes sont paramétrées maintenant. Par exemple HibernateTemplate.executeXXX(), HibernateTemplate.getXXX(), HibernateTemplate.mergeXXX() renvoyer T, HibernateTemplate.loadAll() renvoie List<T>.Pourquoi les méthodes findXXX() dans HibernateTemplate retournent une liste non paramétrée?

Mais findXXX() méthodes retournent plaine List, donc je dois le cast à quelque chose comme List<MyEntity>.

Est-ce que quelqu'un sait quelle est la raison? Pourquoi les méthodes de recherche ne sont pas paramétrées? Ou probablement il y a d'autres API paramétrées?

Voici ce que je fais.

Ceci est la partie pertinente de 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 est une interface qui contient plusieurs méthodes qui permettent de récupérer, enregistrer et supprimer les objets. DeviceDAOHibernateImpl implémente cette interface, par ex.

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

J'ai dû marquer cette méthode avec l'annotation @SuppressWarnings ("non cochée").

Répondre

5

printemps n'a pas mis à jour HibernateTemplate parce qu'il est dépréciée au printemps 3. (Voir Classic Spring Usage: Hibernate)

Spring suggests a simpler usage of Hibernate, qui ne lie pas le code d'application du Cadre de printemps.

En gros: Injecter SessionFactory, utilisez @Transactional et faire le codage en veille prolongée plaine tandis que le printemps crée automatiquement et engage les transactions:

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

Mise à jour: c'est le code exemple de printemps, pas le mien, mais je l'ai changé retourne une collection générique. Aucun casting requis. (Mais vous devez respecter le type de sécurité vous, le compilateur ne peut vous aider)

+1

Merci pour votre réponse. Malheureusement je ne comprends pas comment ça m'aide. Votre solution renvoie toujours la collecte simple. Et traite avec API de niveau inférieur. – AlexR

+0

En tout cas merci de votre référence que vous avez envoyé. Je suis en train de lire les documents et j'espère que je comprendrai ce qu'il faut faire bientôt. – AlexR

+0

Ce n'est pas ma solution, c'est l'exemple de code de Spring. Et non, cela ne concerne pas les api de niveau inférieur, Spring crée, ferme et valide automatiquement les Transactions et les Sessions, il suffit d'appeler getCurrentSession() –

0

je voudrais aller avec l'exemple ci-dessus SessionFactory und l'étendre à

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

simplement l'utiliser sans Critériums si vous voulez tous Les lignes

0

Le fait est que les gars d'Hibernate ne veulent pas utiliser de génériques dans l'API Hibernate. Autant que je sache, leur argument est qu'ils ne veulent pas forcer Java 1.4 à passer à 1.5. HibernateTemplate ne convertit pas les résultats de la recherche au type paramétré afin de rester cohérent avec l'API Hibernate originale (non générique).

Questions connexes