2015-01-10 1 views
1

Spring Tools Suite 및 Pivotal tc Server Developer Edition에서 Spring + Hibernate + EntityManager + Spring Data + PostgreSQL 데이터베이스를 개발하려고합니다. applicationContext.xml 트랜잭션을 위해 JPA EntityManager를 열 수 없습니다. JTA EntityManager는 getTransaction()을 사용할 수 없습니다.

<context:component-scan base-package="com.me, dk.me" /> 
<jpa:repositories base-package="dk.me.data" 
    entity-manager-factory-ref="entityManagerFactory"> 
</jpa:repositories> 
<!-- tx:jta-transaction-manager /--> 
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 
<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="MyPU"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
    </property> 
</bean> 

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

내의 persistence.xml은 다음과 같습니다 : 내 구성은

<persistence-unit name="MyPU" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <properties> 
     <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/> 
     <property name="hibernate.connection.username" value="postgres"/> 
     <property name="hibernate.connection.password" value="masterkey"/> 
     <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/postgres"/>   
     <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> 
     <property name = "javax.persistence.jdbc.driver" value = "org.postgresql.Driver"/> 
     <property name = "javax.persistence.jdbc.url" value = "jdbc:postgresql://localhost:5432/postgres"/> 
     <property name = "javax.persistence.jdbc.user" value = "postgres"/> 
     <property name = "javax.persistence.jdbc.password" value = "masterkey"/> 
     <!-- property name="hibernate.ejb.cfgfile" value="hibernate.cfg.xml"/--> 
     <property name="hibernate.transaction.jta.platform" 
     value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform" /> 
    </properties> 
</persistence-unit>  

코드가 꽤 straightforware입니다, 간단한 전화가 모든 콩을 읽을 수있는 봄의 데이터 저장소가 있습니다. 오류 님에게 메일입니다

Could not open JPA EntityManager for transaction; nested exception is java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction() 

그리고 스택 추적 :

org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction() 
at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:430) 
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) 
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:420) 
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:257) 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:122) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
at com.sun.proxy.$Proxy35.findAll(Unknown Source) 
at dk.nmc.imarket.framework.services.FrameworkService.getAll(FrameworkService.java:32) 
at dk.nmc.imarket.web.framework.FrameworkListFrame.getAll(FrameworkListFrame.java:37) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at javax.el.BeanELResolver.getValue(BeanELResolver.java:97) 
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) 
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) 
at org.apache.el.parser.AstValue.getValue(AstValue.java:167) 
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:187) 
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) 
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) 
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182) 
at javax.faces.component.UIData.getValue(UIData.java:730) 
at org.primefaces.component.datatable.DataTable.getValue(DataTable.java:729) 
at org.primefaces.component.api.UIData.getDataModel(UIData.java:575) 
at javax.faces.component.UIData.getRowCount(UIData.java:355) 
at org.primefaces.component.datatable.DataTableRenderer.encodeTbody(DataTableRenderer.java:579) 
at org.primefaces.component.datatable.DataTableRenderer.encodeRegularTable(DataTableRenderer.java:220) 
at org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:192) 
at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:74) 
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875) 
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1786) 
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782) 
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782) 
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:424) 
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:124) 
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) 
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) 
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) 
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at com.nmc.nxapps.web.filters.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:33) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:146) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:277) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction() 
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.getTransaction(AbstractEntityManagerImpl.java:1368) 
at org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:67) 
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:110) 
at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380) 
... 72 more 

이 문제가

입니다 - 내 구성이 일부 sende을 않는, 무엇을하는 것은 수정해야합니다. 나는 디자인 선택의 폭이 넓다는 것을 알고있다. (예 : 지역 대 분산 트랜잭션, 데이터 소스 사용 등), 현재와 가장 유사한 구성에 원활하게 도달하기를 원한다. 개발 자체. 가장 최근의 호환 가능한 (4.x) 버전의 Spring과 Hibernate를 사용하고 있습니다. pom.xml에는 버전 충돌이 없으며 mavan 패키지 나 배포 시간 예외가 없습니다. 런타임시 첫 번째 요청이있을 때 예외가 발생합니다.

미리 제안 해 주셔서 감사합니다.

+0

당신은 로컬 트랜잭션에 대한 트랜잭션 관리자를 구성하지만, JTA를 사용하도록 EntityManagerFactory를 말한다. 그럼 뭐야? 그래서 당신의 설정은 이해가되지 않습니다. 그리고 그것은 예외가 당신에게 말하는 것입니다. –

답변

2

당신의 Spring 트랜잭션 관리자는이 persistence.xml가 JTA를 사용하도록 구성되어있는 동안 JpaTransactionManager

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

입니다 : 당신은 또한 RESOURCE_LOCAL 거래를위한 의미있는 hibernate.connection 속성을 사용

<persistence-unit name="MyPU" transaction-type="JTA"> 

.

  1. 그런 다음 JBoss의 XA DataSource와 JTA 트랜잭션을 사용하지 않으려면 RESOURCE_LOCAL에 지속성 단위 transaction-type을 변경

    <persistence-unit name="MyPU" transaction-type="RESOURCE_LOCAL"> 
    

    을하고이 속성을 제거합니다

    <property name="hibernate.transaction.jta.platform" 
    value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform" /> 
    
  2. JTA를 원하면 Spring JTATransactionManager을 구성하고 로컬 데이터 소스 관련을 제거해야합니다 JBoss의 XA 데이터 소스를 찾기 위해 JNDI를 사용하는 동안210 개 특성 :

    <jta-data-source>java:/DefaultDS</jta-data-source> 
    
관련 문제