Общий шаблон Дао: поиск Дао по классам - PullRequest
0 голосов
/ 04 февраля 2012

С универсальным интерфейсом 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();
}

Вы реализуете GenericDaoImpl с вашим любимым ORM, например Hibernate, для обработки загрузки и сохранения общих объектов. В итоге вы получите UserDao, StoreDao, TransactionDao, PetsDao и еще 50 Dao, каждый из которых имеет свою логику того, как объект должен быть сохранен, загружен и удален. У вас также может быть много экземпляров GenericDao, каждый для типа класса, который требует только универсальной обработки.

Я ищу реализацию службы, которая будет обрабатывать эти операции для любого объекта DataObject и выберет подходящий Dao для этого. Если для этого объекта есть реализация Dao, используйте ее, в противном случае используйте GenericDao.

Один из способов сделать это - использовать оператор DaoFactory if / else для проверки типа объекта и возврата соответствующего Дао. Однако это потребует от вас внесения изменений в заводские настройки каждый раз, когда добавляется новый Дао, и это не очень элегантно.

Какой лучший способ реализовать это? Чтобы спросить это по-другому, как вы находите Дао, связанный с определенным классом?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2012

Взгляните на Сормулу . Я автор. Это позволяет вам получить «дао» по классу. Вы не пишете "дао".

См. пример нулевой конфигурации :

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 голосов
/ 04 февраля 2012

Я однажды написал 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);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...