Java 使用Hibernate构建服务层
我正在开发一个中型应用程序,使用Struts2、Hibernate和Spring来管理sessionFactory的生命周期。我的问题是,我应该创建一个大的服务类来为我的整个应用程序提供所有服务吗?或者应该为每个模型创建一个服务类 假设我有一个大的服务班Java 使用Hibernate构建服务层,java,spring,hibernate,service,struts2,Java,Spring,Hibernate,Service,Struts2,我正在开发一个中型应用程序,使用Struts2、Hibernate和Spring来管理sessionFactory的生命周期。我的问题是,我应该创建一个大的服务类来为我的整个应用程序提供所有服务吗?或者应该为每个模型创建一个服务类 假设我有一个大的服务班 @Transactional public class Services { // So Spring can inject the session factory SessionFactory sessionFactory;
@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
}
@Transactional
公共课服务{
//因此Spring可以注入会话工厂
会话工厂会话工厂;
public void setSessionFactory(SessionFactory值){
sessionFactory=值;
}
//sessionFactory.getCurrentSession()的快捷方式
公开会议sess(){
返回sessionFactory.getCurrentSession();
}
公共事件getEventById(长id){
返回(Event)sess().load(Event.class,id);
}
公众人物getPersonById(长id){
返回(Person)sess().load(Person.class,id);
}
public void deleteEventById(长id){
sess().delete(getEventById(id));
}
public void deletePersonById(长id){
sess().delete(getPersonById(id));
}
公共void createEvent(字符串名称){
Event theEvent=新事件();
theEvent.setName(名称);
sess().save(事件);
}
public void createPerson(字符串名称){
人员p=新人员();
p、 集合名(名称);
sess().save(p);
}
@抑制警告(“未选中”)
公共列表getEvents(){
返回sess().createQuery(“来自事件”).list();
}
@抑制警告(“未选中”)
公共列表getPeople(){
返回sess().createQuery(“来自个人”).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));
}
…这里有更多的服务方法
}
最好的方法是什么?为整个应用程序提供一个大型服务类?或者每个型号有不同的服务类别?为完整的应用程序创建一个大型服务将没有意义,随着应用程序的增长,它将开始创建一个
可读性以及维护问题
遵循模块化方法总是更好的。正如@Asag所建议的:
为不同的模块创建不同的服务,并在其中定义与服务相关的方法。这将帮助您分离功能,也将帮助将来在同一应用程序上工作的任何人。提供了一些关于构建服务层的好指导。在中,您可以找到以下内容:
对于足够小的应用程序,只有一个就足够了
抽象,以应用程序本身命名。以我的经验
较大的应用程序被划分为几个“子系统”,每个子系统
其中包括一个完整的垂直切片,穿过
架构层
因此,在服务层模式中没有成文的法律。在我看来,您不属于小型应用程序(您的Services
类有太多的方法),因此一切都归结为识别应用程序上的子系统。本书还推荐了与抽象相关的服务层(可能是EventService
或PeopleService
)或应用程序行为(如EventManagementService
);最终由您决定您的项目的最佳代码组织。我的建议是遵循REST,使用最少的CRUD方法设置PersonService
和EventService
。一个具体的例子会很好。例如,请看UserService