Tapestry重写HibernateSessionManager错误

Tapestry重写HibernateSessionManager错误,hibernate,tapestry,Hibernate,Tapestry,我正在尝试覆盖org.apache.tapestry5.hibernate.HibernateSessionManager。为此,我在AppModule中添加了以下内容: public static void contributeServiceOverride( MappedConfiguration<Class<?>, Object> configuration) { configuration.addInstance(HibernateSess

我正在尝试覆盖
org.apache.tapestry5.hibernate.HibernateSessionManager
。为此,我在AppModule中添加了以下内容:

public static void contributeServiceOverride(
        MappedConfiguration<Class<?>, Object> configuration)
{
    configuration.addInstance(HibernateSessionManager.class,
            HibernateSessionManagerOverride.class);
}

查看hibernateModule.java,我可以看到以下内容:

@Contribute(ServiceOverride.class)
public static void provideInjectableSessionObject(
        MappedConfiguration<Class, Object> configuration, 
        @HibernateCore Session session)
{
    configuration.add(Session.class, session);
}

我不想贬低Lance的回答,但使用这种方法,我发现ThreadCleanupListener没有被添加或调用,这意味着会话没有在线程生命周期结束时回滚。我修改了上面的示例,将覆盖添加为threadcleanup侦听器

public static HibernateSessionManager decorateHibernateSessionManager(
        HibernateSessionManager defaultManager,
        @Autobuild HibernateSessionManagerOverride overrideManager,
        PerthreadManager perthreadManager)
{
    perthreadManager.addThreadCleanupListener(overrideManager);
    return overrideManager;
}
这对于会话在使用后回滚和关闭至关重要

public static HibernateSessionManager decorateHibernateSessionManager(
        HibernateSessionManager defaultManager, 
        @Autobuild HibernateSessionManagerOverride overrideManager)
{
    return overrideManager;
}
public static HibernateSessionManager decorateHibernateSessionManager(
        HibernateSessionManager defaultManager,
        @Autobuild HibernateSessionManagerOverride overrideManager,
        PerthreadManager perthreadManager)
{
    perthreadManager.addThreadCleanupListener(overrideManager);
    return overrideManager;
}