Объект не управляется после получения его из базы данных - PullRequest
0 голосов
/ 15 января 2019

Я использую Play Framework и в настоящее время делаю CRUD пользователей. Я создал хранилище для выполнения операций с базой данных с использованием Play Framework JPAApi . Соответствующие из них это

<U> U jpaWrapper(Function<EntityManager, U> function) {
    return jpaApi.withTransaction(function);
}

public CompletionStage<T> update(T entity) {
    return supplyAsync(() -> jpaWrapper(em -> update(em, entity)), executionContext);
}

private T update(EntityManager em, T entity) {
    em.refresh(entity);
    return entity;
}

public CompletionStage<Usuario> findById(int id) {
    return supplyAsync(
          () -> jpaWrapper(em -> findById(id, em)),
          executionContext);
}

private Usuario findById(int id, EntityManager em) {
    return (Usuario) JpaResultHelper.getSingleResultOrNull(
          em.createNamedQuery("Usuario.findById", Usuario.class)
                .setParameter("id", id)
    );
}

В моем контроллере я редактирую пользователя, сначала находя его в хранилище, а затем устанавливая правильные параметры. Это действие контроллера.

public CompletionStage<Result> editUser() {
    Usuario editedUser = formFactory.form(Usuario.class).bindFromRequest("id", "nombre", "email", "rol").get();

    return usuarioRepository.findById(editedUser.getId()).thenCompose( dbUser -> {
        dbUser.setNombre(editedUser.getNombre());
        dbUser.setRol(editedUser.getRol());
        dbUser.setEmail(editedUser.getEmail());

        return usuarioRepository.update(dbUser).thenApplyAsync( u ->
              redirect(routes.UserController.listUsers())
        );
    });
}

Проблема в том, что когда я вызываю метод, сущность оказывается неуправляемой со следующей трассировкой стека.

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[CompletionException: java.lang.IllegalArgumentException: Entity not managed]]
    at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:251)
    at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:178)
    at play.core.server.AkkaHttpServer$$anonfun$1.applyOrElse(AkkaHttpServer.scala:382)
    at play.core.server.AkkaHttpServer$$anonfun$1.applyOrElse(AkkaHttpServer.scala:380)
    at scala.concurrent.Future.$anonfun$recoverWith$1(Future.scala:413)
    at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:37)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60)
    at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)
    at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:91)
    at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
Caused by: java.util.concurrent.CompletionException: java.lang.IllegalArgumentException: Entity not managed
    at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273)
    at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280)
    at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1592)
    at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: Entity not managed
    at org.hibernate.internal.SessionImpl.fireRefresh(SessionImpl.java:1320)
    at org.hibernate.internal.SessionImpl.refresh(SessionImpl.java:1277)
    at models.management.AbstractRepository.update(AbstractRepository.java:54)
    at models.management.AbstractRepository.lambda$null$4(AbstractRepository.java:31)
    at play.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:142)
    at play.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:100)
    at models.management.AbstractRepository.jpaWrapper(AbstractRepository.java:40)
    at models.management.AbstractRepository.lambda$update$5(AbstractRepository.java:31)
    at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
    at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...