首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型Dao模式:按类查找Dao

泛型Dao模式:按类查找Dao
EN

Stack Overflow用户
提问于 2012-02-05 01:39:20
回答 2查看 1.2K关注 0票数 0

使用通用的dao接口:

代码语言:javascript
复制
public interface GenericDAO<T extends DataObject, ID extends Serializable> {
      T save (T object);
      T load (ID id);
      void remove (ID id);
      Class<T> getPersistedType();
}

您可以使用自己喜欢的对象关系映射来实现GenericDaoImpl,比如Hibernate来处理通用对象的加载和持久化。您最终得到了UserDao、StoreDao、TransactionDao、PetsDao和其他50个Dao,每个Dao在如何保存、加载和删除对象方面都有不同的逻辑。您还可能有许多GenericDao实例,每个实例对应一个只需要泛型处理的类类型。

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

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

有什么更好的方法来实现这一点?换种方式问,如何找到与特定类关联的Dao?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-05 01:50:23

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

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

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

代码语言:javascript
复制
    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
EN

Stack Overflow用户

发布于 2012-02-05 02:50:25

看看sormula吧。我是作者。它允许你通过类来获取“道”。你不会写任何“道”。

请参阅zero config example

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9142899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档