Struts2 + 完整 Hibernate 插件 --> 会话已关闭?

2024-04-25

与这个问题相关(答案并没有真正切中要点):

Hibernate with Struts2 - 有用的 Hibernate 插件或其他关闭会话的方法? https://stackoverflow.com/questions/5901137/hiberate-with-struts2-use-full-hibernate-plugin-or-another-method-to-close-sess

我有相同的设置: Struts 2.2.3 和 struts2-fullhibernatecore-plugin-2.2.2-GA 。我没有更改 Struts2 和插件的默认设置。我使用的是 MySQL,没有额外的连接池,一般来说也没什么花哨的。

我在我的操作中使用以下代码:

FeedGroup persistent = null;
List<FeedGroup> list = objectList = (List<FeedGroup>) session.createCriteria(FeedGroup.class)
        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
        .list();
if (feedgroup.getId() != 0) // a new one
{
    persistent = (FeedGroup) session.get(FeedGroup.class, id);
}
if (persistent != null)
{
    persistent.copyValuesFromOther(feedgroup);
    session.update(persistent);
}
else
    session.save(feedgroup);

return list;

这给了我以下异常大约每 10 个案例中就有一个,这在我的代码中不会发生,但可能是在插件提交事务之后。

org.hibernate.SessionException: Session is closed!

org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72)
org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1346)
abelssoft.newspaper.actions.ActionHelper.prepare(ActionHelper.java:65)
com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:167)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
java.lang.Thread.run(Thread.java:619)

是我代码逻辑的问题还是插件的问题?如果是后者,更改配置有帮助吗?我想按原样使用该插件,我只是担心它不能可靠地工作,或者我对数据库内容的理解太原始并且我的代码需要重写;-)。


好吧,由于没有人得到答案,我再次研究了这个问题和代码,并用谷歌搜索了一下。

  • 事实 1:该插件仅支持 Struts 2.1.6,另外我使用的是新的 Tomcat 7,所以我猜测有些东西可能无法与该插件一起使用。

  • 事实 2:Hibernate 论坛中有人指出,如果您尝试访问会话而不是访问会话,则可能会出现此问题打开一个新的: (底部附近的解决方案)

看来事实 1 导致了注释@session and @transaction无法正常工作,或者我错误地使用了它们,因为它们在我的准备方法中通常为空,这是一个类,我的所有 struts2 操作都从中派生:

public abstract class ActionHelper extends ActionSupport implements Preparable, ...

在本课程中,我使用了以下通常适用于迄今为止所有其他项目(Struts 2.1.6 和 Tomcat 6)的注释:

@SessionTarget
Session db;
@TransactionTarget
Transaction transaction;
private FeedGroupDAO _feedGroupDao;

在准备方法中,我有防御性编程代码,用于检查会话是否为空,然后将其替换为当前的休眠会话。问题是这个会议经常关闭,如果你问你能找到什么if (!session.isOpen())

因此,现在我在 ActionHelper 类的准备方法中使用以下代码:

    public void prepare() throws Exception {
    // initialize DAO Objects with Session and Transaction

    if (session == null)
    {
        session = com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getNewSession();
        if (!session.isOpen())
            throw new NullPointerException("Fix the code: session's not here");

        transaction = session.beginTransaction();
    }
    _feedGroupDao = new FeedGroupDAO(session,transaction); // init more DAOs with the same session/transaction

The getNewSession()该插件的方法似乎使用Hibernate的openSession()在内部,因此这似乎是 Hibernate 论坛的工作解决方案。此外,这仍然支持 OpenSessionInView 模式,因为 struts2-fullhibernate-plugin 正在管理从静态获取的会话和事务getNewSession()方法。作为旁注,我尝试尽快从防御性编程转向抛出异常;-)

希望这可以帮助你。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Struts2 + 完整 Hibernate 插件 --> 会话已关闭? 的相关文章

随机推荐