使用Hibernate构建服务层

时间:2012-12-03 00:58:00

标签: java spring hibernate service struts2

我正在使用Struts2,Hibernate和Spring处理中型应用程序来管理sessionFactory的生命周期。我的问题是,我应该创建一个大型服务类,为我的整个应用程序提供所有服务吗?或者应该为每个模型创建一个Service类?

假设我有一个大服务类

@Transactional
public class Services {
    // So Spring can inject the session factory
    SessionFactory sessionFactory;
    public void setSessionFactory(SessionFactory value) {
        sessionFactory = value;
    }

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

    public Event getEventById(long id) {
        return (Event) sess().load(Event.class, id);
    }

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

    public void deleteEventById(long id) {
        sess().delete(getEventById(id));
    }

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

    public void createEvent(String name) {
        Event theEvent = new Event();
        theEvent.setName(name);
        sess().save(theEvent);
    }

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

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

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

    public void removePersonFromEvent(int personId, int eventId) {
        getEventById(eventId).getPeople().remove(getPersonById(personId));
    }

    public void addPersonToEvent(int personId, int eventId) {
        getEventById(eventId).getPeople().add(getPersonById(personId));
    }

      .....Some more services methods here
}

最好的方法是什么?整个应用程序的一大服务类别?或每个型号不同的服务类别?

2 个答案:

答案 0 :(得分:3)

Martin Fowler's book on Enterprise Patterns有一些关于构建服务层的好指南。在extract of the book中,您可以找到:

  

对于足够小的应用程序,只需要一个就足够了   抽象,以应用程序本身命名。在我的经验中   较大的应用程序被分成几个“子系统”,每个子系统   其中包括完整的垂直切片   架构层。

因此,服务层模式中没有石头法则。我觉得你不是小应用程序的情况(你的Services类有太多的方法),所以一切都减少到你的应用程序识别子系统。本书还推荐与市长抽象相关的服务层(可能是EventServicePeopleService)或应用行为(如EventManagementService);在最后,由您决定项目的最佳代码组织。

答案 1 :(得分:0)

为完整的应用程序创建一个大型服务是没有意义的,它会随着应用程序的增长而开始创建readability以及maintenance问题。

遵循模块化方法总是更好。正如@Asag所建议的那样:

为不同的模块创建不同的服务,并定义与服务相关的方法。这将有助于您将功能分开,以及将来将在同一应用程序上工作的任何人。