38

私は現在、SpringプラグインとHibernateを備えたStruts2を使用してWebアプリケーションを開発しています。オンラインの例を見ていると、ServiceレイヤーとDAOレイヤーの使用法がわかりましたが、Serviceレイヤーとデータアクセスオブジェクトレイヤーの実際の使用法は何ですか?サービスレイヤーがDAOレイヤーのメソッドを呼び出してCRUD操作を実行している場合。DAOレイヤーメソッドを直接呼び出すのは賢明ではないでしょうか?

DaoとServiceLayerのこの例を考えてみましょう

PeopleService

  @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();
        }

    }

PeopleDao

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によってのみ注入され、そのメソッドを呼び出す場合、サービスレイヤーの実際の使用法は何ですか?

4

2 に答える 2

53

ビジネス ロジックがデータ ロジックよりも複雑な場合は、これら 2 つのレイヤーを用意することをお勧めします。サービス層は、ビジネス ロジックを実装します。ほとんどの場合、このレイヤーは、DAO オブジェクトからメソッドを呼び出すだけでなく、より多くの操作を実行する必要があります。また、アプリケーションを大きくすることを考えている場合は、これがおそらく最良のソリューションです。

City エンティティを含めて、People と 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 およびサービス層

サービス層パターンの定義

于 2012-12-09T08:48:50.337 に答える