2013-06-23 87 views
2

我想用Spring 3.2使用JPA和Hibernate以及JPA Provider来开发一个简单的Payroll应用程序。我将它部署在JBoss AS 7服务器上。我不断收到以下错误:JBoss 7 Spring JPA + Hibernate应用程序:没有事务正在进行

16:42:13,811 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/PayrollApp].[payrollApp]] (http--127.0.0.1-8080-1) Servlet.service() for servlet payrollApp threw exception: javax.persistence.TransactionRequiredException: no transaction is in progress 
    at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:993) [hibernate-entitymanager-4.2.2.Final.jar:4.2.2.Final] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_25] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_25] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_25] 
    at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_25] 
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365) [spring-orm-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at com.sun.proxy.$Proxy30.flush(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_25] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_25] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_25] 
    at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_25] 
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) [spring-orm-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at com.sun.proxy.$Proxy30.flush(Unknown Source) 
    at com.colenso.payrollapp.persistence.daos.GenericDAO.add(GenericDAO.java:34) [classes:] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_25] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_25] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_25] 
    at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_25] 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) [spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) [spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) [spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155) [spring-tx-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) [spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) [spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at com.sun.proxy.$Proxy31.add(Unknown Source) 
    at com.colenso.payrollapp.service.HRServiceImpl.addEmployee(HRServiceImpl.java:29) [classes:] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_25] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_25] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_25] 
    at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_25] 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) [spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) [spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) [spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) [spring-tx-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) [spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) [spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at com.sun.proxy.$Proxy32.addEmployee(Unknown Source) 
    at com.colenso.payrollapp.controllers.PaySlipController.showHomePage(PaySlipController.java:42) [classes:] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_25] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_25] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_25] 
    at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_25] 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213) [spring-web-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) [spring-web-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) [spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) [spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) [spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) [spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) [spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) [spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) [spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) [spring-webmvc-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:] 
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final] 
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:] 
    at java.lang.Thread.run(Thread.java:724) [rt.jar:1.7.0_25] 

我使用Spring 3.2没有任何的persistence.xml文件。 我春天应用程序配置文件的相关部分:

<!-- Turn on annotation driven features of spring--> 
    <mvc:annotation-driven/> 
    <!--<context:annotation-config />--> 

    <!--Enable Spring to detect the Controllers and other components automatically and configure them as beans--> 
    <context:component-scan base-package="com.colenso.payrollapp" /> 
<!--Look up the Datasource that's been configured in JBoss as a JNDI datasource--> 
    <jee:jndi-lookup id="datasource" jndi-name="java:jboss/datasources/MySqlDS" resource-ref="false" /> 



    <!--Configuration for the Entity Manger Factory--> 
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="packagesToScan" value="com.colenso.payrollapp.persistence.entities" /> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
     </property> 
     <property name="dataSource" ref="datasource"/> 
     <property name="jpaPropertyMap" ref="jpaPropertyMap" /> 
     <property name="persistenceUnitName" value="payrollPU" /> 
    </bean> 

    <util:map id="jpaPropertyMap"> 
     <entry key="show_sql" value="true" /> 
     <entry key="dialect" value="org.hibernate.dialect.MySQLDialect" /> 
     <entry key="hibernate.hbm2ddl.auto" value="validate" /> 
     <entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/> 
     <entry key="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/> 
     <entry key="hibernate.cache.use_second_level_cache" value="true" /> 
     <entry key="hibernate.cache.use_query_cache" value="false" /> 
     <entry key="hibernate.generate_statistics" value="false" /> 
     <entry key="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" /> 
    </util:map> 


    <!--Enable injection of the Entity Manager--> 
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 

    <!--Enable Spring's Exception Translation Mechanism--> 
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 



    <!--Configuration for the Transactions--> 
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> 
     <property name="transactionManagerName" value="java:jboss/TransactionManager"/> 
    </bean> 
    <tx:annotation-driven /> 
    <tx:jta-transaction-manager /> 

正如你所看到的,我拉着我在standalone.xml文件已配置的数据源。

控制器:

@Controller 
public class PaySlipController { 

    @Autowired 
    HRService hrService; 


    public PaySlipController() { 
    } 

    @RequestMapping("/") 
    public String showHomePage(Map<String, Object> model) { 
     Employee employee1; 
     employee1 = new Employee(); 
     employee1.setFirstName("FN"); 
     employee1.setLastName("LN"); 
     Calendar myDOB = new GregorianCalendar(1965, 6, 15); 
     employee1.setDateOfBirth(myDOB); 


     hrService.addEmployee(employee1); 

     return "home"; 
    } 
} 

如本文enter link description here 这里提到我正在关注的The type-safe generic DAO pattern是所有相关代码: 接口 公共接口GenericDAOInterface {

void add(E entitry); 

void remove(E entity); 

E findById(K id); 

}

实施

public abstract class GenericDAO<E, K> implements GenericDAOInterface<E, K> { 

protected Class entityClass; 
@PersistenceContext 
protected EntityManager entityManager; 

public GenericDAO() { 
    ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass(); 
    this.entityClass = (Class) genericSuperclass.getActualTypeArguments()[1]; 
} 

@Override 
public void add(E entity) { 
    if (entityManager==null) 
     System.out.println("Entity Manager Not Initialised!!"); 
    entityManager.persist(entity); 
    entityManager.flush(); 
} 

@Override 
public void remove(E entity) { 
    entityManager.remove(entity); 
} 

@Override 
public E findById(K id) { 
    return (E) entityManager.find(entityClass, id); 
} 

}

接口:

public interface EmployeeDAO extends GenericDAOInterface<Employee, Integer>{ 

} 

实施

@Repository 
public class EmployeeDAOImpl extends GenericDAO<Employee, Integer> implements EmployeeDAO{ 

} 

接口:

public interface HRService { 

    public void addEmployee(Employee employee); 
} 

实施

@Component 
@Transactional(propagation = Propagation.REQUIRED) 
public class HRServiceImpl implements HRService{ 

    @Autowired 
    private EmployeeDAO employeeDao; 


    @Override 
    public void addEmployee(Employee employee){ 
     employeeDao.add(employee); 
    } 

} 

回答

6

我设法找到基于这个问题的答案Question

我的问题解决它因为使用JTA它是强制性的persistence.xml。这就是我最终做的。

的persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.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_2_0.xsd"> 
    <persistence-unit name="myPU" transaction-type="JTA"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:/jboss/datasources/MySqlDS</jta-data-source> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <class>com.colenso.payrollapp.persistence.entities.Employee</class> 
     <properties> 
      <property name="hibernate.archive.autodetection" value="class"/> 
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/> 
      <property name="hibernate.hbm2ddl.auto" value="update"/> 
      <property name="hibernate.current_session_context_class" value="jta"/> 
      <property name="hibernate.transaction.manager_lookup_class" value="blah blah"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/>   
      <property name="hibernate.connection.release_mode" value="after_statement"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

我改变Spring上下文XML

<!--********************DataBase Configurations********************************--> 

    <!--Look up the Datasource that's been configured in JBoss as a JNDI datasource--> 
    <jee:jndi-lookup id="datasource" jndi-name="java:jboss/datasources/MySqlDS" resource-ref="false" /> 



    <!--Configuration for the Entity Manger Factory--> 
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="packagesToScan" value="com.colenso.payrollapp.persistence.entities" /> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
     </property> 
     <property name="dataSource" ref="datasource"/> 
     <property name="jpaPropertyMap" ref="jpaPropertyMap" /> 
     <property name="persistenceUnitName" value="myPU" /> 
    </bean> 

    <util:map id="jpaPropertyMap"> 
     <entry key="show_sql" value="true" /> 
     <entry key="dialect" value="org.hibernate.dialect.MySQLDialect" /> 
     <entry key="hibernate.hbm2ddl.auto" value="validate" /> 
     <entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/> 
     <entry key="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/> 
     <entry key="hibernate.cache.use_second_level_cache" value="true" /> 
     <entry key="hibernate.cache.use_query_cache" value="false" /> 
     <entry key="hibernate.generate_statistics" value="false" /> 
     <entry key="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" /> 
    </util:map> 


    <!--Enable injection of the Entity Manager--> 
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 

    <!--Enable Spring's Exception Translation Mechanism--> 
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 



    <!--Configuration for the Transactions--> 
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" > 
     <property name="allowCustomIsolationLevels" value="true" /> 
     <property name="transactionManagerName" value="java:/TransactionManager"/> 
    </bean> 
    <tx:annotation-driven /> 
+0

谢谢。这帮了我很多! –

1

启用JTA没有持久性。xml,你需要设置jtaDatsource属性而不是数据源:

<bean id="pcdEntityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
    p:dataSource-ref="pcdDataSource" 
    p:jtaDataSource-ref="pcdDataSource" 
    p:jpaVendorAdapter-ref="jpaVendorAdapter" 
    p:jpaProperties-ref="jpaProperties" 
    p:persistenceUnitName="pcd-unit" 
    p:packagesToScan="com.compay.x.db.entity" />  
相关问题