一尘不染

通用DAO或特定DAO记录带有多个表的信息的传递?

hibernate

我正在创建一个Web应用程序,允许用户使用spring和hibernate通过GUI通过DB存储和检索数据库中的信息。

在创建DAO和服务层时,我陷入了困境。我想创建一种可以添加新交付的方法。在我的交货表中,我有 产品ID客户ID
,它们都映射到各自的表,分别包含 产品名称,产品类型客户名称,客户国家/地区

我遇到的问题是我希望最终用户通过输入 产品类型,产品名称,客户名称,客户国家和日期 来记录交货。我呢

(1)使用添加包含这些对象的新交付的方法创建DAO

要么

(2)创建一个仅将通用对象持久保存到数据库的DAO,然后使用服务方法为每个单独的对象实现DAO?

感谢您的帮助!

/ D


阅读 206

收藏
2020-06-20

共1个答案

一尘不染

这是我的通用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
,并使其更容易测试。事务应在服务层上,并直接与工作单元有关。

2020-06-20