2017-02-12 1 views
0

현재 MongoDB를 java 플레이 프레임 워크 서버와 JPA로 설정하는 중입니다. @Transactional 주석이 어떤 기능이 오류가 취득함으로써 지금 내가 오류가 오전 :Mongodb로 Hibernate 설정하기 "EntityManager를 제거하려고 시도했지만 아무 것도 설정되지 않았습니다"

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[CompletionException: java.lang.IllegalStateException: Tried to remove the EntityManager, but none was set.]] 
     at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:293) 
     at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:220) 
     at play.api.GlobalSettings$class.onError(GlobalSettings.scala:160) 
     at play.api.DefaultGlobal$.onError(GlobalSettings.scala:188) 
     at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorHandler.scala:100) 
     at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:100) 
     at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:99) 
     at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:346) 
     at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:345) 
     at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
Caused by: java.util.concurrent.CompletionException: java.lang.IllegalStateException: Tried to remove the EntityManager, but none was set. 
     at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:292) 
     at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:308) 
     at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:593) 
     at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:577) 
     at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:474) 
     at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:1977) 
     at scala.concurrent.java8.FuturesConvertersImpl$CF.apply(FutureConvertersImpl.scala:21) 
     at scala.concurrent.java8.FuturesConvertersImpl$CF.apply(FutureConvertersImpl.scala:18) 
     at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
     at scala.concurrent.BatchingExecutor$Batch$$anonfun$run$1.processBatch$1(BatchingExecutor.scala:63) 
Caused by: java.lang.IllegalStateException: Tried to remove the EntityManager, but none was set. 
     at play.db.jpa.JPAEntityManagerContext.pop(JPAEntityManagerContext.java:74) 
     at play.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:155) 
     at play.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:195) 
     at play.db.jpa.TransactionalAction.call(TransactionalAction.java:25) 
     at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:108) 
     at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:108) 
     at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) 
     at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) 
     at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:56) 
     at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70) 

이 오류가 발생을하면 내 방법이에 @Transactional이있는 경우에만.

나는 build.sbt 올바른 종속성을 추가 :

libraryDependencies += javaJpa 
libraryDependencies += "org.hibernate.ogm" % "hibernate-ogm-core" % "5.0.0.Final" 
libraryDependencies += "org.hibernate.ogm" % "hibernate-ogm-mongodb" % "5.0.0.Final" 

을 그리고 conf의/META-INF/persitence.xml 구성 :/

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" 
      version="2.1"> 
    <persistence-unit name="defaultPersistenceUnit" transaction-type="JTA"> 
     <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider> 
     <non-jta-data-source>DefaultDS</non-jta-data-source> 
     <properties> 
      <property name="hibernate.ogm.datastore.provider" 
        value="org.hibernate.ogm.datastore.mongodb.impl.MongoDBDatastoreProvider"/> 
      <property name="hibernate.ogm.datastore.host" value="127.0.0.1"/> 
      <property name="hibernate.ogm.datastore.port" value="27017"/> 
      <property name="hibernate.ogm.datastore.database" value="[DB name here]"/> 
      <property name="hibernate.ogm.datastore.safe" value="true"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

그리고 conf의 내 기본 지속성 단위를 설정 application.conf :

jpa.default=defaultPersistenceUnit 

여기 내 샘플 방법입니다 :

@Transactional() 
public Result put() { 
    Test tmp = play.libs.Json.fromJson(request().body().asJson(), Test.class); 
    JPA.em().persist(tmp); 
    return ok(play.libs.Json.toJson(tmp)); 
} 

답변

0

글쎄, 이걸 보냈다 며, 어리 석다. 문제는 거래 유형이 다음과 같이 리소스 로컬 일 필요가 있다는 것입니다.

<persistence-unit name="defaultPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 
관련 문제