使用通用的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,比如Hibernate来处理通用对象的加载和持久化。您最终得到了UserDao、StoreDao、TransactionDao、PetsDao和其他50个Dao,每个Dao在如何保存、加载和删除对象方面都有不同的逻辑。您还可能有许多GenericDao实例,每个实例对应一个只需要泛型处理的类类型。
我希望实现一个服务,可以为任何DataObject处理这些操作,并选择正确的Dao来完成它。如果此对象有Dao实现,则使用它,否则使用GenericDao。
一种方法是使用DaoFactory if/else语句检查对象类型,并返回腐蚀Dao。但是,这需要您在每次添加新的Dao时对工厂进行修改,这并不是很优雅。
有什么更好的方法来实现这一点?换种方式问,如何找到与特定类关联的Dao?
发布于 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
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);
}
}发布于 2012-02-05 02:50:25
看看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);https://stackoverflow.com/questions/9142899
复制相似问题