2016-09-14 52 views
0

我在遊戲框架2.5(Java)的獲取運行時錯誤:試圖刪除Entit yManager,但沒有設置

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[CompletionException: java.lang.IllegalStateException: Tried to remove the Entit yManager, but none was set.]] 
     at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:280) 
     at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:206) 
     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:98) 
     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:344) 
     at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343) 
     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 
public Result logincheck(){ 

    Form<User> loginForm = Form.form(User.class).bindFromRequest(); 

    User user = loginForm.get(); 

    User searchUser = UserDao.findUser(user); 

    if (searchUser != null){ 
     return ok(homepage.render()); 
    } 

    return ok(login.render(loginForm)); 
} 

在課堂上的UserDAO :

public static User findUser(User user){ 

    EntityManager em = jpaApi.em(); 

    TypedQuery<User> query = JPA.em().createQuery("select u.* from [RL].[dbo].[userdetails] u where u.userid = :username and u.password = :password", User.class); 

    query.setParameter("username", user.userid); 
    query.setParameter("password", user.password); 

    try{ 
     return (User) query.getSingleResult(); 


    } catch(NoResultException e){ 
     return null; 

    } 


} 
+0

顯然「選擇U *從[RL]。 [dbo]。[userdetails]「是無效的JPQL。不一定是你在這裏引用的問題,但無論如何... –

+0

感謝您的回覆尼爾。我試圖重寫聲明,但無法解決問題。你能寫出正確的一個嗎?我的班級名稱是User和表名是userdetails,schema = dao(SQL Server) –

+0

_SELECT u FROM User u ..._這從任何基本的JPA教程中都很明顯 –

回答

2

您在同一個方法中使用JPA.em()和jpaApi。其實這應該是同一個實體經理。從play 2.5開始,正確的方法是jpaApi,JPA.em()已被棄用。你應該注意注入jpaApi。

的代碼可能是這樣的:

public static User findUser(User user) { 
    JPAApi jpaApi = Play.current().injector().instanceOf(JPAApi.class); 
    EntityManager em = jpaApi.em(); 
    TypedQuery<User> query = em.createQuery("select u.* from [RL].[dbo].[userdetails] u where u.userid = :username and u.password = :password", User.class); 
    ... 
} 

你可以閱讀有關依賴注入更多here在播放

3

我們發現這個問題與play2.5工作時。我們可以通過將 persistence.xml文件到項目固定它作爲指定在這裏:Play 2.5 JavaJPA creating a persistence unit

,並添加在application.conf如下:

jpa.default=defaultPersistenceUnit 
相關問題