【问题标题】:Generic Dao Pattern: lookup Dao by class通用 Dao 模式:按类查找 Dao
【发布时间】:2012-02-04 17:39:20
【问题描述】:

使用通用 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,它们对于如何保存、加载和删除对象都有不同的逻辑。您可能还有许多 GenericDao 实例,每个实例都对应一个只需要泛型处理的类类型。

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

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

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

【问题讨论】:

    标签: java persistence


    【解决方案1】:

    我曾经写过一个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);
        }
    
    }
    

    【讨论】:

    • 希望看到您的实施。
    • 您需要等到星期一。 :-)
    • 我添加了一些东西.. 没有什么很详细的。
    【解决方案2】:

    看看sormula。我是作者。它允许您按类获得“道”。你不写任何“道”。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 2016-09-12
      • 2013-04-19
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多