2016-04-13 4 views
2

Ich möchte UserDao Klasse GenericDAO erweitern, wo ich alle CRUD-Methoden haben werde. Ich habe Artikel von IBM gelesen: http://www.ibm.com/developerworks/java/library/j-genericdao/index.html, aber ich konnte es nicht implementieren. Könnte mir jemand ein Beispiel anhand meiner benutzerdefinierten UserDao-Klasse zeigen?Wie GenericDAO Klasse auf Hibernate implementieren

@Transactional(value="myTransactionManager") 
public class UserDao { 

    @Qualifier("mySessionFactory") 
    public SessionFactoryImpl sessionFactory; 

    public void setSessionFactory(SessionFactoryImpl sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    public List<UserEntity> getAll() { 
     Query query = sessionFactory.getCurrentSession().createQuery(
       "from UserEntity "); 
     List<UserEntity> userList = query.list(); 
     return userList; 
    } 

    public void updaet(UserEntity userEntity) { 
     sessionFactory.getCurrentSession().update(userEntity); 
    } 

    public void delete(UserEntity userEntity) { 
     sessionFactory.getCurrentSession().delete(userEntity); 
    } 

    public void save(UserEntity userEntity) { 
     sessionFactory.getCurrentSession().save(userEntity); 
    } 

} 

ich versuchte Klasse wie dieses

public class GenericDao{ 

    @Qualifier("mySessionFactory") 
    public SessionFactoryImpl sessionFactory; 

    public void setSessionFactory(SessionFactoryImpl sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    public <T> List<T> getAll(Class<T> t) { 
     Query query = sessionFactory.getCurrentSession().createQuery(
       "from " + t.getName()); 
     List<T> list = query.list(); 
     return list; 
    } 

    public <T> void save(T t) { 
     sessionFactory.getCurrentSession().save(t); 
    } 

    public <T> void update(T t) { 
     sessionFactory.getCurrentSession().update(t); 
    } 

    public <T> void delete(T t) { 
     sessionFactory.getCurrentSession().delete(t); 
    } 
} 

zu schreiben, aber wenn ich versuche, Daten mit UserDao so zu ziehen:

public List<UserEntity> getAll() { 
    List<UserEntity> list = UserDao.findAll(); 
} 

Eclipse-IDE List<UserEntity> list = UserDao.findAll(); geben Fehler für Zeile: Verfahren findAll() ist für den Typ UserDao unterdefiniert.

+0

Sie müssen den Typ GenericDao passieren, 'GenericDao 'und erweitert es, offensichtlich ... – dambros

+0

' UserDao' erweitert 'GenericDao' nicht Sie fügen die Generika der Klassendefinition nicht hinzu. 'GenericDao ' – Jens

+0

UserDao erweitert GenericDao in der Beschreibung nicht. Aber wenn ich es erweitere gibt es Fehler wie beschrieben. –

Antwort

1

dies ist meine Umsetzung:

GenericDao:

@Repository 
public class GenericDao<T extends DbObject> { 

    @Autowired 
    private SessionFactory sessionFactory; 

    private Class<T> getParameterizedClass() { 
     return (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
    } 

    public T findById(final Serializable id) { 
     return (T) getCurrentSession().get(getParameterizedClass(), id.toString()); 
    } 

    public void persist(final T object) { 
     getCurrentSession().persist(object); 
    } 

    public void saveOrUpdate(final T object) { 
     getCurrentSession().saveOrUpdate(object); 
    } 

    public void delete(final T object) { 
     getCurrentSession().delete(object); 
    } 

    public T merge(final T object) { 
     return (T) getCurrentSession().merge(object); 
    } 

} 

UserDao:

public class UserDao extends GenericDao<User> { 

} 

Entity:

@Entity 
@Table(name = "...")  
public class User extends DbObject { 
} 
+0

was diese Methode für: private Klasse getParameterizedClass() { return (Klasse ) ((ParameterizedType) getClass(). GetGenericSuperclass()). GetActualTypeArguments() [0]; } –

Verwandte Themen