0

I'm new to Spring and trying to implement Generic DAO like in this article http://www.ibm.com/developerworks/library/j-genericdao/ . I have couple of entities - ConcreteEntity1 and ConcreteEntity2. Also, I have classes

public interface GenericDao<T extends Serializable>  {
    public T get(long id);
    public List<T> get(String hql);
    public void remove(T persistentObject);
    public void add(T entity);
}

and

@Repository("hibGenericDao")
public class HibGenericDaoImpl<T extends Serializable> implements GenericDao<T> {

    @Autowired
    private SessionFactory sessionFactory;

    private Class<T> type;

    public HibGenericDaoImpl(Class<T> type) {
        this.type = type;
    }

    /** {@inheritDoc} */
    @Override
    public T get(long id) {
        T entity;
        try (Session session = sessionFactory.getCurrentSession()) {
            entity = session.get(type, id);
        }
        return entity;
    }

    /** {@inheritDoc} */
    @Override
    public List<T> get(String hql) {
        List<T> entityList;
        try (Session session = sessionFactory.getCurrentSession()) {
            Query query = session.createQuery(hql);
            entityList = query.list();
        }
        return entityList;
    }

    /** {@inheritDoc} */
    @Override
    public void remove(T persistentObject) {
        try (Session session = sessionFactory.getCurrentSession()) {
            session.delete(persistentObject);
        }
    }

    /** {@inheritDoc} */
    @Override
    public void add(T entity) {
        try (Session session = sessionFactory.getCurrentSession()) {
            session.saveOrUpdate(entity);
        }
    }
}

Now I'm trying to write service layer, and I want to autowire HibGenericDaoImpl<ConcreteEntity1> where field type contains ConcreteEntity1.class. Could you please say how to perform it without XML?

T. Kryazh
  • 25
  • 1
  • 10

2 Answers2

0

Replace your constructor with zero-arg constructor. Then you can get T type with reflection using this link.

Community
  • 1
  • 1
Everv0id
  • 1,862
  • 3
  • 25
  • 47
0

If you are already using spring, you can use the GenericTypeResolver utility class, as shown in this SO answer: How to get a class instance of generics type T

You should be able to do something like:

 this.type = (Class<T>) GenericTypeResolver.resolveTypeArgument(getClass(), GenericDao.class);
Community
  • 1
  • 1
ninj
  • 1,529
  • 10
  • 10