使用通用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并且不是很优雅时,这将要求您对工厂进行修改。
实施此更好的方法是什么?换一种方式, 你如何找到与特定班级相关的道?
答案 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”。
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);