Can I do this Generic thing?

dao, generics, java

Solution

This article does what you need it to do. http://blog.xebia.com/2009/03/09/jpa-implementation-patterns-data-access-objects/

Problem

It seems I'm missing something with Java Generics because something I think is simple, it appears to me that can´t be done. Maybe you can help... This is the scenario: I'm coding a generic abstract DAO with simple CRUD operation so every specific DAO of my application can have it for free: ``` public abstract DefaultDAO<T,V> { private EntityManager manager; public BaseDAO(EntityManager em) { this.manager = em; } public void create(T entity) { manager.persist(entity); } // You know the others... public T read(V pk) { // Now, here is the problem. // EntityManager signature is: public <T> T find(Class<T> entityClass, Object primaryKey); // So I must provide the type of the object this method will be returning and // the primary key. // resulting object will be T typed and pk type is V type (although is not needed to type it since the method expects an Object) // So... I expected to be allowed to do something like this return manager.find(T, pk); // But it's not allowed to use T here. T is not an instance } } ``` Now I would go and implement an specific DAO: ``` public PersonDAO extends DefaultDAO<PersonEntity, Long> { public PersonDAO(EntityManager em) { super(em); } // CRUD methods are inherited } ``` And client code for my DAO would be: ``` EntityManager manager = ... PersonDAO dao = new PersonDAO(manager); Long pk = ..... PersonEntity person = dao.find(pk); // DAO would return a PersonEntity ``` When client executes code, BaseDAO knows the type of entity it must return and the type of the primary key of that entity because I set it on the specific dao, but I don't know how to code the read() method correctly. Hope you can help. Thanks a lot!

Original source