我正在创建一个Web应用程序,允许用户使用spring和hibernate通过GUI存储和检索数据库中的信息。
在创建DAO和服务层时,我遇到了困难。我想创建一个可以添加新交付的方法。在我的交付表中,我有产品ID 和客户ID ,它们都映射到自己的表,其中包含产品名称,产品类型和客户名称,客户所在国家/地区。
我遇到问题的部分是我希望最终用户通过输入产品类型,产品名称,客户名称,客户所在国家/地区和日期来记录交货。我,
(1)使用添加包含这些对象的新交付的方法创建DAO
或
(2)创建一个DAO,它只是将一般对象保存到DB,然后使用服务方法为每个单独的对象实现DAO?
感谢您的帮助!
/ D
答案 0 :(得分:0)
这是我的通用dao的片段,我将其注入每个服务层类。
@Component("Dao")
public class Dao implements IDao {
@Resource(name = "sessionFactory")
private SessionFactory sessionFactory;
@Override
public <T> 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> T get(final Class<T> type, final Long id) {
return (T) sessionFactory.getCurrentSession().get(type, id);
}
@Override
public <T> List<T> getFieldsEq(final Class<T> type, final Map<String, Object> restrictions) {
final Session session = sessionFactory.getCurrentSession();
final Criteria crit = session.createCriteria(type);
for (Map.Entry<String, Object> entry : restrictions.entrySet()) {
crit.add(Restrictions.eq(entry.getKey(), entry.getValue()));
}
return crit.list();
}
}
可以在服务层中使用它,如下所示:
@Transactional(readOnly = true)
public List<City> getCities() {
return dao.getAll(City.class);
}
当然,你可以为特定的复杂查询扩展dao。让一个通用dao遵守单点责任原则, DRY ,并使其更容易测试。交易应该在服务层上,并直接与工作单位相关。