我在Java数据库中使用Play 2.2.3和Java。
我的目标是制作一个对象的副本,将其保存到数据库中,然后获取新对象的id以在重定向中使用它。
守则如下:
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)
我尝试使用明确的Getters和Setters作为Id,但那时似乎没有任何工作。我还尝试从数据库序列中获取下一个id,但只返回null
。似乎Ebean使用的是通用平台而不是特定的DB2Platform,这可能是一个问题。
当我不调度updateTeilnehmerForm
并重新加载新数据库条目应显示的概述页面时,一切都很好,模板似乎能够读取id。
我希望你们有个主意,因为我不知所措。
答案 0 :(得分:0)
最后我明白了。问题在于Ebean版本3.2.2,其显然包含在Play 2.2.3中。
经过一些反编译后,我发现DatabasePlatformFactory
没有" case"对于DB2数据库。因此,每次都使用通用平台。
经过对Github的一些研究后,我发现这在以后的版本中得到了修复。我通过将此行添加到build.sbt
文件来将Ebean依赖关系更新为3.2.5:
dependencyOverrides += "org.avaje.ebeanorm" % "avaje-ebeanorm" % "3.2.5"
之后我甚至不需要ebean.properties文件。