使用来自多个表的信息来记录交付的通用或特定 DAO?
Posted
技术标签:
【中文标题】使用来自多个表的信息来记录交付的通用或特定 DAO?【英文标题】:General or specific DAO to record delivery with information from multiple tables? 【发布时间】:2012-04-27 17:39:56 【问题描述】:我正在创建一个 Web 应用程序,它允许用户使用 spring 和 hibernate 通过 GUI 存储和检索数据库中的信息。
在创建 DAO 和服务层时,我遇到了困难。我想创建一个可以添加新交付的方法。在我的交付表中,我有 Product Id 和 Customer Id 两者都映射到它们自己的包含 Product Name, Product Type 和 的表>客户名称、客户国家/地区。
我遇到问题的部分是我希望最终用户通过输入产品类型、产品名称、客户名称、客户国家和日期来记录交货。我呢,
(1) 使用添加包含这些对象的新交付的方法创建一个 DAO
或
(2) 创建一个只将一般对象持久化到数据库的 DAO,然后使用服务方法为每个单独的对象实现 DAO?
感谢您的帮助!
/D
【问题讨论】:
【参考方案1】:这是我的通用 dao 的 sn-p,我将其注入到每个服务层类中。
@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,并使其更易于测试。事务应位于服务层并与工作单元直接相关。
【讨论】:
以上是关于使用来自多个表的信息来记录交付的通用或特定 DAO?的主要内容,如果未能解决你的问题,请参考以下文章