2011-03-02 30 views
0

我有一個非常奇怪的異常被拋出,這是非常令人沮喪的跟蹤。當我從休眠狀態切換到Eclipselink時,這種行爲開始,以滿足對缺少功能的需求。RollbackException與Spring Web Flow 2.2 +/Spring 3.05和EclipseLink 2.1.2

這似乎是Spring和Eclipselink之間對我的一種溝通小姐,但它也可能是我的配置錯失。你能幫我弄清楚這一點嗎?我把我的頭髮拉過來可能很簡單。

任何幫助將不勝感激!

org.springframework.webflow.execution.ActionExecutionException: Exception thrown executing [[email protected] targetAction = [[email protected] expression = companyDao.listAll(), resultExpression = flowScope.entityList], attributes = map[[empty]]] in state 'null' of flow 'flows/company/list' -- action execution attributes were 'map[[empty]]' 
    org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:60) 
    org.springframework.webflow.engine.ActionList.execute(ActionList.java:155) 
    org.springframework.webflow.engine.Flow.start(Flow.java:534) 
    org.springframework.webflow.engine.impl.FlowExecutionImpl.start(FlowExecutionImpl.java:366) 
    org.springframework.webflow.engine.impl.RequestControlContextImpl.start(RequestControlContextImpl.java:234) 
    org.springframework.webflow.engine.SubflowState.doEnter(SubflowState.java:101) 
    org.springframework.webflow.engine.State.enter(State.java:194) 
    org.springframework.webflow.engine.Transition.execute(Transition.java:227) 
    org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:393) 
    org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214) 
    org.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:119) 
    org.springframework.webflow.engine.Flow.handleEvent(Flow.java:555) 
    org.springframework.webflow.engine.impl.FlowExecutionImpl.handleEvent(FlowExecutionImpl.java:388) 
    org.springframework.webflow.engine.impl.RequestControlContextImpl.handleEvent(RequestControlContextImpl.java:210) 
    org.springframework.webflow.engine.ViewState.handleEvent(ViewState.java:232) 
    org.springframework.webflow.engine.ViewState.resume(ViewState.java:196) 
    org.springframework.webflow.engine.Flow.resume(Flow.java:545) 
    org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:261) 
    org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:169) 
    org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183) 
    org.springframework.faces.webflow.JsfFlowHandlerAdapter.handle(JsfFlowHandlerAdapter.java:48) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    ... 
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction rolled back because transaction was set to RollbackOnly. 
    org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:476) 
    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:393) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) 
    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.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621) 
    mypackage.GenericDAOImpl$$EnhancerByCGLIB$$945581be.listAll(<generated>) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:69) 
    org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:110) 
    org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:57) 
    org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:102) 
    org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:97) 
    org.springframework.binding.expression.spel.SpringELExpression.getValue(SpringELExpression.java:84) 
    org.springframework.webflow.action.EvaluateAction.doExecute(EvaluateAction.java:75) 
    org.springframework.webflow.action.AbstractAction.execute(AbstractAction.java:188) 
    org.springframework.webflow.execution.AnnotatedAction.execute(AnnotatedAction.java:145) 
    org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:51) 
    org.springframework.webflow.engine.ActionList.execute(ActionList.java:155) 
    org.springframework.webflow.engine.Flow.start(Flow.java:534) 
    org.springframework.webflow.engine.impl.FlowExecutionImpl.start(FlowExecutionImpl.java:366) 
    org.springframework.webflow.engine.impl.RequestControlContextImpl.start(RequestControlContextImpl.java:234) 
    org.springframework.webflow.engine.SubflowState.doEnter(SubflowState.java:101) 
    org.springframework.webflow.engine.State.enter(State.java:194) 
    org.springframework.webflow.engine.Transition.execute(Transition.java:227) 
    org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:393) 
    org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214) 
    org.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:119) 
    org.springframework.webflow.engine.Flow.handleEvent(Flow.java:555) 
    org.springframework.webflow.engine.impl.FlowExecutionImpl.handleEvent(FlowExecutionImpl.java:388) 
    org.springframework.webflow.engine.impl.RequestControlContextImpl.handleEvent(RequestControlContextImpl.java:210) 
    org.springframework.webflow.engine.ViewState.handleEvent(ViewState.java:232) 
    org.springframework.webflow.engine.ViewState.resume(ViewState.java:196) 
    org.springframework.webflow.engine.Flow.resume(Flow.java:545) 
    org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:261) 
    org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:169) 
    org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183) 
    org.springframework.faces.webflow.JsfFlowHandlerAdapter.handle(JsfFlowHandlerAdapter.java:48) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:343) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:96) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187) 
    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.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.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
javax.persistence.RollbackException: Transaction rolled back because transaction was set to RollbackOnly. 
    org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:92) 
    org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:63) 
    org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:467) 
    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:393) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) 
    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.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621) 
    mypackage.GenericDAOImpl$$EnhancerByCGLIB$$945581be.listAll(<generated>) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:69) 
    org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:110) 
    org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:57) 
    org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:102) 
    org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:97) 
    org.springframework.binding.expression.spel.SpringELExpression.getValue(SpringELExpression.java:84) 
    org.springframework.webflow.action.EvaluateAction.doExecute(EvaluateAction.java:75) 
    org.springframework.webflow.action.AbstractAction.execute(AbstractAction.java:188) 
    org.springframework.webflow.execution.AnnotatedAction.execute(AnnotatedAction.java:145) 
    org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:51) 
    org.springframework.webflow.engine.ActionList.execute(ActionList.java:155) 
    org.springframework.webflow.engine.Flow.start(Flow.java:534) 
    org.springframework.webflow.engine.impl.FlowExecutionImpl.start(FlowExecutionImpl.java:366) 
    org.springframework.webflow.engine.impl.RequestControlContextImpl.start(RequestControlContextImpl.java:234) 
    org.springframework.webflow.engine.SubflowState.doEnter(SubflowState.java:101) 
    org.springframework.webflow.engine.State.enter(State.java:194) 
    org.springframework.webflow.engine.Transition.execute(Transition.java:227) 
    org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:393) 
    org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214) 
    org.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:119) 
    org.springframework.webflow.engine.Flow.handleEvent(Flow.java:555) 
    org.springframework.webflow.engine.impl.FlowExecutionImpl.handleEvent(FlowExecutionImpl.java:388) 
    org.springframework.webflow.engine.impl.RequestControlContextImpl.handleEvent(RequestControlContextImpl.java:210) 
    org.springframework.webflow.engine.ViewState.handleEvent(ViewState.java:232) 
    org.springframework.webflow.engine.ViewState.resume(ViewState.java:196) 
    org.springframework.webflow.engine.Flow.resume(Flow.java:545) 
    org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:261) 
    org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:169) 
    org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183) 
    org.springframework.faces.webflow.JsfFlowHandlerAdapter.handle(JsfFlowHandlerAdapter.java:48) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:343) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:96) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187) 
    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.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.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 

這裏是有問題的方法:

@Override 
@Transactional(readOnly = true) 
public List<entityType> listAll() { 
    String entityName = entityClass.getSimpleName(); 
    if (entityClass.isAnnotationPresent(Entity.class)) { 
     Entity ea = (Entity) entityClass.getAnnotation(Entity.class); 
     if (ea.name() != null && ea.name().length() > 0) { 
      entityName = ea.name(); 
     } 

     // TODO: If this query exists: entityName + ".list", use it, otherwise: 
     EntityManager em = getEntityManager(); 
     Query query = null; 
     try { 
      // Try and find a query with the name (EntityName).list 
      query = em.createNamedQuery(entityName + ".list"); 
     } catch (IllegalArgumentException ex) { 
      try { 
       // No query with this name, so fill it in with a custom query 
       if (entityClass.getMethod("deletedDate", Date.class) != null) { 
        query = em.createQuery("SELECT e FROM " + entityName + " e WHERE deletedDate is null"); 
       } else { 
        throw new NoSuchMethodException(); 
       } 
      } catch (NoSuchMethodException ex1) { 
       query = em.createQuery("SELECT e FROM " + entityName + " e"); 
      } 

     } 

     return query.getResultList(); 
    } 
    return null; 
} 

Spring配置如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xmlns:faces="http://www.springframework.org/schema/faces" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/faces http://www.springframework.org/schema/faces/spring-faces-2.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <!-- This will load environmental properties for us as well, filling in 
     the necessary data for connecting to an in-memory RDB by default, 
     or another DB if supplied properties by the environment --> 
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <!-- System values take priority --> 
     <property name="systemPropertiesMode" value="2" /> 
     <!-- Check the properties file if we don't find the value in the environment --> 
     <property name="locations"> 
      <list> 
       <value>classpath:/memory-database.properties</value> 
      </list> 
     </property> 
    </bean> 

    <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource"> 
     <property name="url" value="${JDBC_CONNECTION_STRING}"/> 
     <property name="username" value="${PARAM1}"/> 
     <property name="password" value="${PARAM2}"/> 
     <property name="driverClassName" value="${PARAM3}"/> 
     <property name="validationQuery" value="${PARAM4}"/> 
    </bean> 

    <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
     <property name="jpaDialect" ref="jpaDialect"/> 
    </bean> 

    <context:annotation-config/> 

    <!-- Enable aspectj based transactions --> 
    <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" /> 
    <!-- the transactional advice (i.e. what 'happens'; see the <aop:advisor/> bean below) --> 
    <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
    <!-- the transactional semantics... --> 
     <tx:attributes> 
      <!-- all methods starting with 'get' are read-only --> 
      <tx:method name="get*" read-only="true"/> 
      <tx:method name="find*" read-only="true"/> 
      <tx:method name="refresh*" read-only="true"/> 
      <tx:method name="list*" read-only="true"/> 
      <!-- other methods use the default transaction settings (see below) --> 
      <tx:method name="*"/> 
     </tx:attributes> 
    </tx:advice> 

    <aop:config proxy-target-class="true"> 
     <aop:pointcut id="DaoOps" expression="execution(* mypackage.GenericDAO.*(..))"/> 
     <aop:advisor advice-ref="txAdvice" pointcut-ref="DaoOps"/> 
    </aop:config> 

    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/> 
     <property name="jpaDialect" ref="jpaDialect"/> 
    </bean> 

    <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter" > 
     <property name="showSql" value="true"/> 
     <property name="generateDdl" value="true" /> 
    </bean> 

    <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect"/> 

    <import resource="webmvc-config.xml"/> 
    <import resource="applicationContext-security.xml"/> 
</beans> 

的persistence.xml如下:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    ... Many Entity Classes Listed Here ... 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
     <property name="eclipselink.ddl-generation" value="create-tables"/> 
     <property name="eclipselink.weaving" value="static"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

靜態織入實際上是通過一個ant tas來完成的k from Maven:

<plugin> 
     <artifactId>maven-antrun-plugin</artifactId> 
     <executions> 
      <execution> 
       <phase>process-classes</phase> 
       <configuration> 
        <tasks> 
         <java classname="org.eclipse.persistence.tools.weaving.jpa.StaticWeave" 
      classpathref="maven.runtime.classpath" fork="true"> 
          <arg line="-loglevel FINE -persistenceinfo src/main/resources target/classes target/classes"/> 
         </java> 
        </tasks> 
       </configuration> 
       <goals> 
        <goal>run</goal> 
       </goals> 
      </execution> 
     </executions> 
    </plugin> 

回答

1

爲什麼在事務性方法中捕獲運行時異常(IllegalArgumentException)?它將標記春季託管事務回滾。

各地

@Transactional(noRollbackFor=IllegalArgumentException.class) 
+0

工作這是我能拿出來測試在運行時命名查詢的存在,最快捷的方式。回想起來,我確實有一個持久化實體的列表,並且可以像JPA那樣掃描它們以查找類似的@NamedQueries註釋,但是這讓我覺得應該有更好的方法來做到這一點。現在測試這個解決方案。 – SplinterReality 2011-03-02 05:37:24

+0

不知何故,只是做noRollbackFor,無論是在XML配置,還是在@Transactional,都沒有工作。然而,感謝你的指針,我藉此機會重新設計了listAll()函數來被動地使用預先計算的列表查詢,這是在Dao實例化時計算出來的。這似乎解決了這個問題。 – SplinterReality 2011-03-02 06:15:20