当前位置: 首页 > 面试题库 >

服务和DAO层的职责和使用

丌官高远
2023-03-14
问题内容

我目前正在使用带有Spring插件和hibernate的Struts2开发一个Web应用程序,并且在查看在线示例时,我看到了Service和DAO层的使用,现在才知道Service和数据访问对象层的真正用途是什么?如果服务层只是在调用DAO层的方法来执行CRUD操作。直接调用DAO层方法不明智吗?

假设此示例为Dao和Service Layer

人员服务

  @Transactional
    public class PeopleService {

        private PeopleDao pDao;

        public PeopleDao getPDao() { return pDao; }

        public void setPDao(PeopleDao peopleDao) { this.pDao = peopleDao;   }

        public void createPerson(String name){
            pDao.createPerson(name);
        }

        public List<Person> getPeople(){
            return pDao.getPeople();
        }

    }

人道

public class PeopleDao {

    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public Session sess() {
        return sessionFactory.getCurrentSession();
    }

    public Person getPersonById(long id) {
        return (Person) sess().load(Person.class, id);
    }

    public void deletePersonById(long id) {
        sess().delete(getPersonById(id));
    }

    public void createPerson(String name) {
        Person p = new Person();
        p.setName(name);
        sess().save(p);
    }

    @SuppressWarnings("unchecked")
    public List<Person> getPeople() {
        return sess().createQuery("from Person").list();
    }

}

我的问题是,如果仅将服务层由其代表DAO注入然后调用其方法,则它们的真正用途是什么?


问题答案:

当您的业务逻辑比数据逻辑更复杂时,最好具有这两层。服务层实现业务逻辑。在大多数情况下,此层必须执行更多的操作,而不仅仅是从DAO对象中调用方法。而且,如果您打算使应用程序更大,那么这可能是最好的解决方案。

假设您要包括一个City实体并在People and City之间创建关系。这是一个例子:

@Transactional
public class PeopleService {

    ....
    private PeopleDAO pDAO;
    private CityDAO cDAO;

    ...

    public void createPerson(String name, String city)
     throws PeopleServiceException {
        Person p = new Person();
        p.setName(name);

        City c = cDAO.getCityByName(city);
        if (c == null) throw new ServiceException(city + " doesn't exist!");
        if (c.isFull()) throw new ServiceException(city + " is full!");
        c.addPeople(p);

        sess().save(p);
        sess().save(c);
    }

    ...
}

在此示例中,您可以实施更复杂的验证,例如检查数据的一致性。并且PersonDAO尚未修改。

另一个例子:

Spring的DAO和Service层

服务层模式的定义



 类似资料:
  • 在我的示例中,我有一个Hibernate实体和一个DAO。 当我以这种方式使用DAO时 数据库中只保存了一行(Action2)。当我删除注释时,两行(Action1和Action2)都被保存(这是我需要的行为)。我的问题是服务层上的事务注释如何影响事务(方法executeTransaction())的执行。为什么没有服务层上的事务性注释,这两行都保存在数据库中,而只有最后一行与此注释一起保存?

  • 问题内容: 我正在设计一个基于JPA / Hibernate,Spring和Wicket的新应用。我对DAO和Service层之间的区别还不清楚。根据维基百科,DAO是 一个为某种类型的数据库或持久性机制提供抽象接口的对象,提供某些特定的操作而不公开数据库的详细信息。 我想知道DAO是否可以包含与数据访问无关的方法,但是使用查询执行起来会更容易吗?例如,“获取在一组特定机场上运营的所有航空公司的列

  • 我有一个struts项目,我的客户给了我完整的业务逻辑类。他需要这个忘恩负义的人,昂首阔步,冬眠。 哪一种最好,要将业务逻辑放到我的Dao层,需要为业务逻辑添加一个附加的服务层。 一些strut项目我发现动作类直接访问道。 请建议我哪个更好choice.help高度赞赏。 谢谢,

  • 问题内容: 在课堂上,我们现在学习如何构建Spring应用程序,即使没有直接涉及spring,我们也学习了如何为DAO和服务层对象创建接口。 如果我错了,请纠正我:DAO层是非常抽象的:它仅包含CRUD操作,并进一步用于读取数据(即:获取所有对象,获取特定对象等) 服务层:包含用于创建事物和删除事物的服务,这是业务逻辑应该存在的地方。 现在,所有这些对于服务层来说都是有意义的。除了“更新”对象。你

  • 我正在使用当前层拓扑: 1)道2)服务3)控制器(演示) 在我的一个控制器中,我收到以下呼叫(来自客户端): 控制器现在应该将调用委托给服务层。 问题是,如果我创建一个如下方法: 在我的服务中,我实际上让我的服务层意识到DTO对象! 我认为这是一种不好的做法(或者不是?) 因此,我提出的另一个选择是创建一个新类: 然后调用我的控制器: 这个解决方案的问题是我在我的项目中根本没有使用这个类,所以它看

  • 并且有这些接口的实现。 我的问题是为什么我们需要接口而不是直接实现类?