如何从DAO层访问Web层(控制器)?

时间:2016-02-08 06:37:44

标签: java spring hibernate

我不得不取消正在运行的查询。在我的DAO中,我在启动查询时在Entity.session中设置ServletContext,并在查询完成后将其删除。然后检查Controller ServletContext中是否存在会话,如果存在,则通过调用session.cancelQuery()中会话对象的ServletContext取消查询

这在我的开发环境中工作正常,但在我的pre-prod测试中,整个代码不会在tomcat容器中运行。 Web部件在tomcat中运行,而数据层在java应用程序中运行。因此我在DAO课程中找不到ServletContext,它给了我一个ClassNotFound异常

所以我在DAO中解耦了web层。现在,当我调用DAO hibernate.session时,我在控制器本身设置了calculate()。但这造成了一个问题,即使没有进行计算,现在会话仍然存在,实际上有一些帖子或预先计算。我取消查询的机制不起作用。

所以我需要的是一种从Controller访问DAO以设置会话的方法。我可以在Controller中使用静态方法,然后从中设置会话,但我认为这也不是一个好习惯。

DAO初始代码:

public calculate(){
Session session = mEntityManager.unwrap(Session.class);
//pre possing                   
if(session != null)
{
    mContext.setAttribute(""+view.getId(), session);
}
List<Object[]> results = query.getResultList();
mContext.removeAttribute(""+view.getId());
//post processing
}

解耦的DAO代码: 在控制器中调用calculate方法之前,从控制器调用方法getSession()。然后,当用户从UI请求取消时,在控制器中调用cancel方法。

public Session getSession()
{
    Session session = mEntityManager.unwrap(Session.class);
    return session;
}

public calculate(){
//pre possing                   
List<Object[]> results = query.getResultList();
//post processing
}

控制器:

@RequestMapping
public WebServiceResponse cancel(HttpServletRequest request)
{
    if(mContext.getAttribute(id) != null)
        ((Session)mContext.getAttribute(id)).cancelQuery();
}

1 个答案:

答案 0 :(得分:0)

似乎你有一个复杂的控制流,因为你没有正确地将问题的检测与处理问题分开:你检测到数据层中的问题,但需要在表示层中处理它。

考虑使用例外。让数据层在检测到问题时抛出异常。表示层可以通过捕获异常来处理数据层中的问题。