jBPM与Spring整合无法使用Hibernate的currentSession。

2019-03-25 13:39|来源: 网路

一切按部就班的配置但是只要加上
<prop key="hibernate.current_session_context_class">thread</prop>
jBPM就报错:
no jBPM DB schema: no JBPM4_EXECUTION table.

如果我去掉的<prop key="hibernate.current_session_context_class">thread</prop>,那么启动正常,但是由于我的项目里使用了getCurrentSession这个方法,如果去掉了这个配置,会导致运行异常,请问如何解决这个问题?

版本:
Spring 3
jBPM 4.4
Hiberante 3

web容器Tomcat。

谢谢

问题补充:
guofengcn 写道
spring 整合hibernate管理事物后,session是绑定到事物的,而不是thread。此时hibernate.current_session_context_class应该是SpringSessionContext,而它又会在使用LocalSessionFactoryBean时自动的设置。所以就不需要你去设置current_session_context_class了!把这句配置去掉就OK了。


这个我也查过相关资料,但是我后台用了getCurrentSession(),如果去掉这个配置会报错。

现在我把后台全都改成openSession();目前没大问题,就是心里有点不甘心。不知道有没有其它解决方法?

问题补充:
guofengcn 写道
就应该使用getCurrentSession,这样session是不用你手动去开启关闭的!报了什么错?你把spring+hibernate配置文件贴出来!hibernate和spring整合后,不应该使用opensession的。如果是openSession的话是重新建立了一个新的session,和service层的事物不是同一个session了,也就不是当前thread中的 session了!贴错误,贴配置...


首先由衷的感谢您的回复

下面是异常以及配置:


===========================================下面是异常======================================================


异常所涉及的代码: cn.com.fri.base.security.supports.UserDetailsServiceImpl.loadUserByUsername(UserDetailsServiceImpl.java:43)在最下面
HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:660)
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:412)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
$Proxy22.findAutByUsername(Unknown Source)
cn.com.fri.base.security.supports.UserDetailsServiceImpl.loadUserByUsername(UserDetailsServiceImpl.java:43)
org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:82)
org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:124)
org.springframework.security.authentication.ProviderManager.doAuthentication(ProviderManager.java:120)
org.springframework.security.authentication.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:48)
org.springframework.security.authentication.ProviderManager.doAuthentication(ProviderManager.java:138)
org.springframework.security.authentication.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:48)
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:97)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:109)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:149)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
root cause

org.hibernate.TransactionException: Transaction not successfully started
org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:131)
org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:412)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
$Proxy22.findAutByUsername(Unknown Source)
cn.com.fri.base.security.supports.UserDetailsServiceImpl.loadUserByUsername(UserDetailsServiceImpl.java:43)
org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:82)
org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:124)
org.springframework.security.authentication.ProviderManager.doAuthentication(ProviderManager.java:120)
org.springframework.security.authentication.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:48)
org.springframework.security.authentication.ProviderManager.doAuthentication(ProviderManager.java:138)
org.springframework.security.authentication.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:48)
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:97)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:109)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:149)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.30 logs.

Apache Tomcat/6.0.30


==============================下面是Spring的配置====================================================

<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper" />

<bean id="processEngine" factory-bean="springHelper"
factory-method="createProcessEngine" />

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"></ref>
</property>
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
</bean>

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@192.168.3.141:1521:GBSYS" />
<property name="username" value="GBSYSMGR" />
<property name="password" value="GBSYSMGR" />
</bean>

<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="modify*">PROPAGATION_REQUIRED</prop>
<prop key="attach*">PROPAGATION_REQUIRED</prop>
<prop key="del*">PROPAGATION_REQUIRED</prop>
<prop key="*">readOnly</prop>
</props>
</property>
</bean>

<aop:aspectj-autoproxy />
<bean id="logAspect" class="cn.com.fri.base.security.log.LogAspect" />



<!-- 那些类的哪些方法参与事务 -->
<aop:config>
<aop:pointcut id="allManagerMethod"
expression="execution(* cn.com.fri.base.security.dao.*.*(..))" />
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="transactionInterceptor" />
</aop:config>

<context:annotation-config />
<context:component-scan base-package="*" />
=============================下面是Hibernate.cfg.xml=============






<session-factory>

<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="connection.characterEncoding">utf-8</property>
<property name="connection.useUnicode">true</property>
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>

<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</property>
<property name="hibernate.show_sql">true</property><!--显示的sql语句格式化-->
<property name="format_sql">true</property><!--使显示的sql语句-->
<property name="myeclipse.connection.profile">Oracle-GB</property>

    <mapping resource="jbpm.repository.hbm.xml" />
    <mapping resource="jbpm.execution.hbm.xml" />
    <mapping resource="jbpm.history.hbm.xml" />
    <mapping resource="jbpm.task.hbm.xml" />
    <mapping resource="jbpm.identity.hbm.xml" />


</......>

=========================下面是出问题的地方==========================

List<RolAut> list = new ArrayList<RolAut>();
Session session = this.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from " + RolAut.class.getSimpleName()
+ " ent where ent.rolId in (:ids)");
q.setParameterList("ids", ids);
list = q.list();
session.getTransaction().commit();
return list;

问题补充:
guofengcn 写道
就应该使用getCurrentSession,这样session是不用你手动去开启关闭的!报了什么错?你把spring+hibernate配置文件贴出来!hibernate和spring整合后,不应该使用opensession的。如果是openSession的话是重新建立了一个新的session,和service层的事物不是同一个session了,也就不是当前thread中的 session了!贴错误,贴配置...


好像是多了一个commit?。。。。。。

相关问答

更多
  • 在项目上右键.下面有个myeclipse,移到上面会出现很多选项.先后导入struts,hibernate,spring即可!!!
  • PlugIn: 通过编写与部署(struts-config.xml)跟踪Web应用程序的初始化与最终的关闭. 通常实现数据库连接的打开与释放. 请求应答主过程: 1>用户请求 2>ActionServlet调用相应的doPost() OR doGet() 3>doPost() OR doGet()立即调用process() 4>process()会调用当前的RequestProcessor对象的process() 5>RequestProcessor会处理FormBean和ActionBean,并执行最终的 ...
  • t推荐你去 饭客网络下载 有很多教程
  • 先下载jbpm4
  • 这个是Spring 3.0 核心类库必须Hibernate支持,直接ok,最好建议不要用工具直接生成!
  • 呵呵,这个是肯定的啊 还有 spring代替MVC这说法你自己想出来的吧? 呵呵,这个spring不是这样用的 如何使用啊?怎么注入。。注入到哪啊? 这个就要你重载下hibernateDaoSupport,这样分页就更方便了,还可以用hibernate的方法 看这个 public class MyHibernateDaoSupport extends HibernateDaoSupport{ @Resource(name="sessionFactory") public void setSuperSessi ...
  • 你这个问题: 1,spring3整合hibernate4,在dao中都是使用getCurrentSession()来得到session; 2,dao中使用完了session,不要close(); 3,在service中开启事务,随便你使用@Transactional标签还是用XML做AOP都可以;注意必须开启事务,要不getCurrentSession()方法得到的session使用会报错; 4,在web.xml中开启OpenSessionInViewFilter。注意使用org.springframewo ...
  • 在hibernate的query 接口查询出一个list后 list里有两个方法 list.setFirstResult(int a); list.setMaxSize(int a); 第一个方法用来设置当前页要显示的第一条记录是从哪一个记录开始的 第二个方法用来设置每页的最大记录数 通过这个就足以实现分页了,先实现了功能再说吧,这样做反正是不太好呵呵
  • 主要是通过Spring管理Hibernate的SessionFactory,Hibernate中的SessionFactory是重量级的线程,而且Spring中提供了对hibernate中dao着了很好的封装,但初学者可以先自己写DAO,但是有了一定的基础的话,用Spring管理DAO或者它自身的DAO,都很好!!Spring对大多ORM框架都有很好的支持,如Ibatis、JPA等等!! Spring用IOC控制DAO,而且可以用AOP一起和hibernate管理事物!!再实际开发中都非常有用的!!