2011-07-21 7 views
1

Stringフィールドに格納された型に基づいてエンティティ・オブジェクトを作成する単純なDAOを作成しようとしています。どのように動的に変更された型を返すのですか? メソッドUserDAOクラスのfindById()メソッドは、Userクラスオブジェクトを返す必要があります。 ProductDAOと同じ方法でProductが返されます。 私は、DAOを拡張するすべてのクラスでfindByIdを実装したくないので、自動的に行う必要があります。Java DAOファクトリ・ダイナミック・リターン・オブジェクト・タイプ

例コード:まず

class DAO { 
    protected String entityClass = ""; 
    public (???) findById(int id) { 
     // some DB query 
     return (???)EntityFromDatabase; // how to do this? 
    } 
} 
class UserDAO extends DAO { 
    protected String entityClass = "User"; 
} 
class ProductDAO extends DAO { 
    protected String entityClass = "Product"; 
} 
class User extends Entity { 
    public int id; 
    public String name; 
} 

答えて

2

class DAO<T> { 
    // protected String entityClass = ""; 
    public T findById(int id) { 

     return (T)EntityFromDatabase; // how to do this? 
    } 
} 
class UserDAO extends DAO<User> { 
    //protected String entityClass = "User"; 
} 
class ProductDAO extends DAO<Product> { 
    //protected String entityClass = "Product"; 
} 
class User extends Entity { 
    public int id; 
    public String name; 
} 
+0

それは、ありがとう! – Matthias

+0

あなたは大歓迎です:) –

0

、代わりStringを使用する、クラスを使用します。次は、entityManager

class DAO<T> { 
    private Class<T> entityClass; 

    // How you get one of these depends on the framework. 
    private EntityManager entityManager; 

    public T findById(int id) { 
     return em.find(entityClass, id); 
    } 
} 

は、今では別のDAOタイプに依存し、例えば使用することができます(docsを参照)を使用

DAO<User> userDAO = new DAO<User>(); 
DAO<Product> userDAO = new DAO<Product>(); 
+0

DAOで 'entityClass'を取得するには? – duckegg

2

使用Generics in javaにそれを修正します。ここで例を見つけてください。

public interface GenericDAO<T,PK extends Serializable> { 

    PK create(T entity); 
    T read(PK id); 
    void update(T entity); 
    void delete(T entity); 
} 
public class GenericDAOImpl<T,PK extends Serializable> implements GenericDAO<T,PK>{ 
    private Class<T> entityType; 
    public GenericDAOImpl(Class<T> entityType){ 
      this.entityType = entityType; 
    } 
    //Other impl methods here... 
} 
0

この記事はDon't Repeat the DAOを強くお勧めします。そして、あなたは悪い考えをしていないと言わなければならない。

関連する問題