使用ebean复制对象并获取新对象的id

时间:2014-08-20 08:05:26

标签: playframework playframework-2.0 ebean

我在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。

我希望你们有个主意,因为我不知所措。

1 个答案:

答案 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文件。