簡體   English   中英

通用道模式:按類查找道

[英]Generic Dao Pattern: lookup Dao by class

使用通用的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(例如Hibernate)來實現GenericDaoImpl,以處理加載和持久化通用對象。 最后得到UserDao,StoreDao,TransactionDao,PetsDao和其他50個Dao,它們在如何保存,加載和刪除對象方面都有不同的邏輯。 您可能還具有GenericDao的許多實例,每個實例都只需要一個泛型處理的類類型。

我正在尋求實現一種服務,該服務將為任何DataObject處理這些操作,並將選擇正確的Dao來實現。 如果該對象有Dao實現,請使用它,否則使用GenericDao。

一種方法是使用DaoFactory if / else語句檢查對象類型,並返回相應的Dao。 但是,這將要求您每次添加新的Dao時都必須對工廠進行修改,而且不太美觀。

有什么更好的方法來實現呢? 換一種方式問,您如何找到與特定班級相關的道?

我曾經寫過一個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);
    }

}

看一看油霜 我是作者。 它使您可以按班級獲得“ dao”。 您不會寫任何“ dao”。

參見零配置示例

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM