2010-11-12 6 views
0

Première fois générique et je suis un peu confus ici.La méthode read (capture # 2-of?) Dans le type GenericDao <Order, capture # 2-of?> N'est pas applicable pour les arguments (Long)

Je donne les résultats suivants:

public interface GenericDao<T, PK extends java.io.Serializable> { 

    /** 
    * Retrieve an object that was previously persisted to the database 
    * using the reference id as primary key 
    * 
    * @param id primary key 
    * @return 
    */ 
    public T read(PK id); 
} 


public class GenericDaoHibernateImpl<T, PK extends java.io.Serializable> implements GenericDao<T, PK> 
{ 
    private Class<T> type; 
    private SessionFactory sessionFactory; 

    /** 
    * 
    */ 
    public GenericDaoHibernateImpl(Class<T> type) 
    { 
     this.type = type; 
    } 


    @SuppressWarnings("unchecked") 
    public T read(final PK id) 
    { 
     return (T) getSession().get(type, id); 
    } 
} 

    <bean id="orderDao" class="vsg.ecotrak.framework.dao.GenericDaoHibernateImpl"> 
    <constructor-arg> 
     <value>vsg.ecotrak.common.order.domain.Order</value> 
    </constructor-arg> 
    <property name="sessionFactory"> 
     <ref bean="sessionFactory"/> 
    </property> 
</bean> 

alors ma classe de service appelle simplement jusqu'à this.getOrderDao() lire (pid) où pId est passé à la méthode de charge de la classe de service en tant que longue..

+0

Avez-vous le code pour OrderDao? – Pace

+0

vsg.ecotrak.common.order.domain.Order boyd4715

+0

Vous devriez retitle votre question à quelque chose comme "Comment puis-je obtenir des médicaments génériques à travailler dans un contexte de printemps?" puis incluez l'exception dans le texte de votre question. Cela rendra les choses plus faciles à trouver plus tard. –

Répondre

2

Le problème réside dans la déclaration de printemps de orderDao. La façon dont vous l'avez écrit, il sera interprété au printemps comme

new GenericDaoHibernateImpl(Order something) 

alors que les médicaments génériques, il faudrait une signature comme celui-ci (suppression de l'argument du constructeur inutile).

new GenericDaoHibernateImpl<Order,Long>() 

Vous ne pouvez pas déduire directement les médicaments génériques du printemps en raison de l'effacement de type à l'exécution, mais vous pouvez créer une nouvelle classe

public class OrderDao extends GenericDaoHibernateImpl<Order,Long> { } 

et référence comme son propre haricot au printemps

<bean id="orderDao" class="vsg.ecotrak.framework.dao.OrderDao"> 
    <property name="sessionFactory"> <ref bean="sessionFactory"/> 
</bean> 

Les génériques sont contenus dans le OrderDao qui se comportera comme prévu en renvoyant uniquement les commandes basées sur PK long.

+0

merci. J'essayais d'éviter le besoin de créer des objets DAO tout le temps. J'ai fini par enlever le PK du générique et utiliser directement le type de données Long. – boyd4715

+1

@ boyd4715 Content de pouvoir aider. En aparté, vous pouvez afficher votre solution afin que d'autres puissent en bénéficier. Il n'y a pas de mal à accepter votre propre réponse, aussi. –