使用 Mongodb "Tried to remove the EntityManager, but none was set" 配置休眠

Configuring Hibernate with Mongodb "Tried to remove the EntityManager, but none was set"

我目前正在努力 MongoDB 设置我的 java 播放框架服务器和 JPA。现在我有一个错误,任何用 @Transactional 注释的函数都会得到这个错误:

play.api.http.HttpErrorHandlerExceptions$$anon: 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$$anonfun$apply.applyOrElse(PlayRequestHandler.scala:100)
        at play.core.server.netty.PlayRequestHandler$$anonfun$$anonfun$apply.applyOrElse(PlayRequestHandler.scala:99)
        at scala.concurrent.Future$$anonfun$recoverWith.apply(Future.scala:346)
        at scala.concurrent.Future$$anonfun$recoverWith.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.processBatch(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.apply(JavaAction.scala:108)
        at play.core.j.JavaAction$$anonfun.apply(JavaAction.scala:108)
        at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1(Future.scala:24)
        at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
        at play.core.j.HttpExecutionContext$$anon.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));
}

好吧,在这上面花了几个星期,我觉得自己很愚蠢。问题是事务类型需要像这样是本地资源:

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