这是我的通用dao的片段,我将其插入到每个服务层类中.
@Component("Dao")
public class Dao implements IDao {
@Resource(name = "sessionFactory")
private SessionFactory sessionFactory;
@Override
public T save(final T o){
return (T) sessionFactory.getCurrentSession().save(o);
}
@Override
public void delete(final Object object) {
sessionFactory.getCurrentSession().delete(object);
}
@Override
public T get(final Class type, final Long id) {
return (T) sessionFactory.getCurrentSession().get(type, id);
}
@Override
public List getFieldsEq(final Class type, final Map restrictions) {
final Session session = sessionFactory.getCurrentSession();
final Criteria crit = session.createCriteria(type);
for (Map.Entry entry : restrictions.entrySet()) {
crit.add(Restrictions.eq(entry.getKey(), entry.getValue()));
}
return crit.list();
}
}
可以在服务层中使用哪种方法,如下所示:
@Transactional(readOnly = true)
public List getCities() {
return dao.getAll(City.class);
}
当然,您可以将dao扩展为特定的复杂查询.拥有一个通用的dao遵循单点责任原则DRY,并且使其更易于测试.事务应在服务层上,并直接与工作单元有关.