[英]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.