2012-02-04 75 views
0

与通用DAO接口:通用DAO模式:查找道由

public interface GenericDAO<T extends DataObject, ID extends Serializable> { 
     T save (T object); 
     T load (ID id); 
     void remove (ID id); 
     Class<T> getPersistedType(); 
} 

您与您喜爱的ORM实现GenericDaoImpl,比如Hibernate来处理负载和持续的通用对象。你最终得到的是UserDao,StoreDao,TransactionDao,PetsDao和另外50个Dao,每个Dao对象的保存,加载和删除都有不同的逻辑。您也可能拥有GenericDao的许多实例,每个实例只需要通用处理的类类型。

我期待实现将处理任何数据对象,这些操作并会选择做正确的道服务。如果此对象有Dao实现,请使用它,否则使用GenericDao。

一种方法是使用DaoFactory if/else语句来检查对象类型,并返回相应的Dao。但是,这将需要您每次添加新的Dao时对工厂进行修改,而不是非常优雅。

什么是更好的实现方式?换一种方式来问, 你如何找到与特定班级相关的Dao?

回答

0

我曾经写过一个GenericHibernateDAOImpl;其实例可用于对任何实体的类型执行读/写或删除操作。我发现有用以下链接:

https://community.jboss.org/wiki/GenericDataAccessObjects?_sscc=t

http://www.ibm.com/developerworks/java/library/j-genericdao/index.html

public class GenericHibernateDAOImpl <T, ID extends Serializable> implements GenericDAO<T extends DataObject, ID extends Serializable> { 
     ... 

     GenericHibernateDAOImpl(Class<? extends T> persistentClass, ISessionManager manager,    IPersister persister, ILogger l) { 
      Validate.noNullElements(Arrays.asList(manager, persister, l)); 
      this.pClass = persistentClass; 
      this.sessionManager = manager; 
      this.persistenceDelegate = persister; 
      this.logger = l; 

     } 
     /** 
     * {@inheritDoc} 
     */ 
     @Override 
     public final T save(final T entity) { 
      persistenceDelegate.save(entity); 
      return entity; 
     } 

     public List<T> findFromCriterions(final Criterion... pCriterions) { 
     final Criteria crit = sessionManager.getSession().createCriteria(pClass); 
     for (Criterion criterion : pCriterions) { 
      crit.add(criterion); 
     } 
     return crit.list(); 
    } 

    } 

public final class SimplePersister implements IPersister { 

    private final ISessionManager sessionManager; 

    public SimplePersister (final ISessionManager manager) { 
     sessionManager = manager; 
    } 

    @Override 
    public <T> void save(final T entity) { 
     sessionManager.getSession().save(entity); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public <T> void delete(final T entity) { 
     sessionManager.getSession().delete(entity); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public <T> void update(final T entity) { 
     sessionManager.getSession().saveOrUpdate(entity); 
    } 

} 
+0

希望能看到您的实现。 – ltfishie 2012-02-04 17:57:55

+0

您需要等到星期一。 :-) – Scorpion 2012-02-04 19:48:14

+0

你有没有找到那个代码的机会呢? =) – ltfishie 2012-02-11 00:07:26

0

看看sormula。我是作者。它可以让你通过课堂获得“dao”。你不写任何“道”。

zero config example

Database database = new Database(connection); 
Table<Inventory> inventoryTable = database.getTable(Inventory.class); 

// insert 
Inventory inventory = new Inventory(); 
inventory.setPartNumber(partNumber); 
inventory.setManufacturerId("Acme"); 
inventory.setQuantity(99); 
inventoryTable.insert(inventory); 

// select 
inventory = inventoryTable.select(partNumber); 

// update 
inventory.setQuantity(1000); 
inventoryTable.update(inventory); 

// delete 
inventoryTable.delete(inventory); 
+0

谢谢,我会去看看。 – ltfishie 2012-02-05 04:12:00