Generic Dao Pattern:按类查找Dao

时间:2012-02-04 17:39:20

标签: java persistence

使用通用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实例,每个实例都是一个只需要通用处理的类类型。

我希望实现一个服务来处理任何DataObject的这些操作,并选择正确的Dao来完成它。如果此对象有Dao实现,请使用它,否则使用GenericDao。

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

实施此更好的方法是什么?换一种方式, 你如何找到与特定班级相关的道?

2 个答案:

答案 0 :(得分: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);
    }

}

答案 1 :(得分:0)

看看sormula。我是作者。它允许你按类获得“dao”。你不写任何“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);