2014-08-20 3 views
1

Я использую Play 2.2.3 с Java для базы данных DB2.Скопируйте объект с ebean и получите идентификатор нового объекта

Моя цель - сделать копию объекта, сохранить его в базе данных, а затем получить идентификатор нового объекта, чтобы использовать его в перенаправлении.

Кодекс выглядит следующим образом:

Teilnehmer teilnehmer = Teilnehmer.getTeilnehmer(id); 
Teilnehmer copy = (Teilnehmer) teilnehmer._ebean_createCopy(); 
copy.id = null; 

copy.save(); 

Ebean.refresh(); 

return updateTeilnehmerForm(copy.id); 

copy -объект прекрасно и точно, как мне это нужно, и это правильно сохраняется в базе данных. Проблема в том, что я не могу позвонить Ebean.refresh(), потому что copy.id объекта-копии все еще null, и это то же самое для вызова метода в операторе return.

Сообщение об ошибке (из Ebean.refresh()):

java.lang.NullPointerException: The id is null 
    at com.avaje.ebeaninternal.server.querydefn.DefaultOrmQuery.setId(DefaultOrmQuery.java:1125) 
    at com.avaje.ebeaninternal.server.querydefn.DefaultOrmQuery.setId(DefaultOrmQuery.java:52) 
    at com.avaje.ebeaninternal.server.core.DefaultBeanLoader.refreshBeanInternal(DefaultBeanLoader.java:413) 
    at com.avaje.ebeaninternal.server.core.DefaultBeanLoader.refresh(DefaultBeanLoader.java:356) 
    at com.avaje.ebeaninternal.server.core.DefaultServer.refresh(DefaultServer.java:509) 
    at com.avaje.ebean.Ebean.refresh(Ebean.java:634) 
    at controllers.Application.copyTeilnehmer(Application.java:138) 
    at Routes$$anonfun$routes$1$$anonfun$applyOrElse$18$$anonfun$apply$18.apply(routes_routing.scala:249) 
    at Routes$$anonfun$routes$1$$anonfun$applyOrElse$18$$anonfun$apply$18.apply(routes_routing.scala:249) 
    at play.core.Router$HandlerInvoker$$anon$7$$anon$2.invocation(Router.scala:183) 
    at play.core.Router$Routes$$anon$1.invocation(Router.scala:377) 
    at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:56) 
    at play.GlobalSettings$1.call(GlobalSettings.java:64) 
    at controllers.BSBTVSecurity$AuthenticatedAction.call(BSBTVSecurity.java:41) 
    at play.core.j.JavaAction$$anon$3.apply(JavaAction.scala:91) 
    at play.core.j.JavaAction$$anon$3.apply(JavaAction.scala:90) 
    at play.core.j.FPromiseHelper$$anonfun$flatMap$1.apply(FPromiseHelper.scala:82) 
    at play.core.j.FPromiseHelper$$anonfun$flatMap$1.apply(FPromiseHelper.scala:82) 
    at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:251) 
    at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:249) 
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
    at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:37) 
    at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:42) 
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386) 
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) 
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 

Я попытался с помощью явных геттеры и сеттеры для Id, но ничего, кажется, работает в данный момент. Я также попытался получить следующий идентификатор из последовательности базы данных, но только вернулся null. Похоже, что Ebean использует общую платформу, а не конкретную платформу DB2Platform, которая может быть проблемой.

Когда я не отправляю сообщение updateTeilnehmerForm и просто перезагружаю страницу обзора, на которой должна появляться новая запись базы данных, все в порядке, и шаблон, похоже, может читать идентификатор.

Надеюсь, у вас есть идея, потому что я в недоумении.

ответ

0

Наконец-то я понял это. Проблема заключается в версии 3.2.2 Ebean, которая, как представляется, включена в игру 2.2.3. После некоторой декомпиляции я увидел, что DatabasePlatformFactory не имел «случая» для базы данных DB2. Поэтому универсальная платформа использовалась каждый раз. После некоторых исследований в Github я обнаружил, что это было исправлено в более поздних версиях. Я обновил Ebean зависимость к 3.2.5, добавив следующую строку в файл build.sbt:

dependencyOverrides += "org.avaje.ebeanorm" % "avaje-ebeanorm" % "3.2.5" 

Я даже не нужен файл ebean.properties после этого.

Смежные вопросы