2011-10-04 7 views
0

actuellement j'essaye d'implémenter a typed generic DAO.Typed DAO générique et Entité

Je ne comprends même pas de compiler quoi que ce soit, puisque NetBeans se plaint de UserDAOHibernate

Interface

attendue ici
Type d'argument L'utilisateur est pas dans les limites de type variable ENTITÉ

Je suis J'ai peur qu'il y ait une erreur évidente dans la façon dont j'utilise l'héritage/interfaces, puisque je suis plutôt nouveau à Java.

Voici un code démonté

public interface GenericEntity<ID extends Serializable> { 
    public abstract ID getId(); 
    public abstract void setId(final ID id); 
} 

public abstract class LongEntity implements GenericEntity<Long> { 
    protected Long id; 
    public Long getId(); 
    public void setId(final Long id); 
} 

public class User extends LongEntity implements Serializable { 
    private String name; 
    private String password; 
    private Customer customer; 
} 

public interface GenericDAO<ENTITY extends GenericEntity<ID>, ID extends Serializable> { 
    public abstract ENTITY findById(ID id); 
    public abstract List<ENTITY> findAll(); 
    public abstract ENTITY makePersistent(ENTITY entity); 
    public abstract void makeTransient(ENTITY entity); 
} 

public abstract class GenericHibernateDAO<ENTITY extends GenericEntity<ID>, ID extends Serializable> 
     implements GenericDAO<ENTITY, ID> { 
} 

public class UserDAOHibernate implements GenericHibernateDAO<User, LongEntity> { 
} 

Est-ce que LongEntity devrait extend GenericEntity<Long>? Si oui, comment ferais-je cela avec le seul niveau ou l'héritage de Java?

Cette approche en couches est-elle un mauvais exemple à suivre? Toutes mes entités ont besoin d'un identifiant et cette implémentation pourrait facilement être réutilisée plus tard avec différents types d'identifiant, donc j'ai pensé que je pourrais l'utiliser.

+1

Sidenote: vous ne devez pas déclarer des méthodes d'interface abstraite (ni publique) - ils sont implicitement public et de toute façon abstraite. :) – Thomas

+0

@Thomas Merci aussi. Sauve-moi quelques autres touches :) – user967058

Répondre

1

L'erreur vient d'ici:

public class UserDAOHibernate implements GenericHibernateDAO<User, LongEntity> { 
} 

Vous avez spécifié que ID Type paramétrés de GenericHibernateDAO est limitée par <ID extends Serializable>.

LongEntity étend GenericEntity, et par conséquent, pourquoi vous avez une discordance de type.

En outre, GenericHibernateDAO est une classe abstraite (et non une interface), vous aurez donc besoin de extends au lieu de implements.

La solution correcte devrait être:

public class UserDAOHibernate extends GenericHibernateDAO<User, Long> { 
} 
+0

Merci! Il y avait une autre erreur au sujet des implements vs étend: 'public class UserDAOHibernate étend GenericHibernateDAO ' – user967058

+0

@ user967058, je l'ai vu, donc j'ai mis à jour. Merci. –