首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GlobalSetting.onStart()上执行PLayframework中的JPA查询

在GlobalSetting.onStart()上执行PLayframework中的JPA查询
EN

Stack Overflow用户
提问于 2014-12-08 15:03:18
回答 1查看 1.8K关注 0票数 1

如何在开始时对播放框架全局类方法执行一些db操作。

我想从其他来源把一些数据放到数据库中。现在我有:

我的代码:

代码语言:javascript
复制
public class Global extends GlobalSettings {


    @Override
    @Transactional
    public void onStart(Application application) {
                    Akka.system().scheduler().schedule(
                            Duration.create(1, TimeUnit.SECONDS), // start task delay
                            Duration.create(24, TimeUnit.HOURS), // between task instance delay
                            //Duration.create(24, TimeUnit.HOURS), // between task instance delay
                            new Runnable() {
                                @Override
                                @Transactional
                                public void run() {
                                    System.out.println("Importing CRM data...");
                                    ImportCrmData.start();
                                    System.out.println("... imported");
                                }
                            },
                            Akka.system().dispatcher()
                    );

我收到了一个错误:

代码语言:javascript
复制
[info] play - Shutdown application default Akka system.
[info] play - datasource [jdbc:mysql://localhost/svp] bound to JNDI as DefaultDS
[info] play - datasource [jdbc:mysql://192.168.0.4/scrm_customer] bound to JNDI as CRM
[info] play - database [default] connected at jdbc:mysql://localhost/svp
[info] play - database [crm] connected at jdbc:mysql://192.168.0.4/scrm_customer
[info] play - Starting application default Akka system.
[info] play - Application started (Dev)
Importing CRM data...
[ERROR] [12/08/2014 15:57:04.773] [application-akka.actor.default-dispatcher-3] [TaskInvocation] No EntityManager bound to this thread. Try wrapping this call in JPA.withTransaction, or ensure that the HTTP context is setup on this thread.
java.lang.RuntimeException: No EntityManager bound to this thread. Try wrapping this call in JPA.withTransaction, or ensure that the HTTP context is setup on this thread.
        at play.db.jpa.JPA.em(JPA.java:55)
        at models.Customer.getByCrmId(Customer.java:185)
        at models.CustomerCRM.importCrmData(CustomerCRM.java:84)
        at actions.ImportCrmData.start(ImportCrmData.java:28)
        at Global$1.run(Global.java:40)
        at akka.actor.LightArrayRevolverScheduler$$anon$3$$anon$2.run(Scheduler.scala:241)
        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)

请给我一些帮助。

我在java中使用了运行框架2.2.4

补充如下:

代码语言:javascript
复制
JPA.withTransaction(() -> {
    ImportCrmData.start();
});

我搞错了。

代码语言:javascript
复制
[info] Compiling 1 Java source to app/modules/common/target/scala-2.10/classes...
[error] app/modules/common/app/Global.java:38: error: illegal start of expression
[error]                                                 JPA.withTransaction(() -> {
[error]                                                                      ^
[error] app/modules/common/app/Global.java:38: error: illegal start of expression
[error]                                                 JPA.withTransaction(() -> {
[error]                                                                         ^
[error] app/modules/common/app/Global.java:38: error: illegal start of expression
[error]                                                 JPA.withTransaction(() -> {
[error]                                                                           ^
[error] app/modules/common/app/Global.java:38: error: ';' expected
[error]                                                 JPA.withTransaction(() -> {
[error]                                                                            ^
[error] app/modules/common/app/Global.java:39: error: illegal start of expression
[error]                                                     ImportCrmData.start();
[error]                                                                  ^
[error] app/modules/common/app/Global.java:39: error: ';' expected
[error]                                                     ImportCrmData.start();
[error]                                                                        ^
[error] app/modules/common/app/Global.java:40: error: illegal start of type
[error]                                                 });
[error]                                                  ^
[error] app/modules/common/app/Global.java:41: error: ')' expected
[error]                                             }
[error]                                              ^
[error] app/modules/common/app/Global.java:42: error: illegal start of expression
[error]                                         },
[error]                                          ^
[error] app/modules/common/app/Global.java:43: error: ';' expected
[error]                                         Akka.system().dispatcher()
[error]                                             ^
[error] app/modules/common/app/Global.java:43: error: ';' expected
[error]                                         Akka.system().dispatcher()
[error]                                                                   ^
[error] 11 errors
[error] (common/compile:compile) javac returned nonzero exit code

最后,我补充说:

代码语言:javascript
复制
                        public void run() {
                            JPA.withTransaction(
                                    ImportCrmData.start()
                                    );
                        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-08 15:21:03

删除@Transactional注释,它们只在控制器中有用。用JPA.withTransaction方法包装客户关系管理导入。Java 8语法:

代码语言:javascript
复制
JPA.withTransaction(() -> {
    ImportCrmData.start();
});

和非Java 8语法:

代码语言:javascript
复制
JPA.withTransaction(new Callback0() {

    @Override
    public void invoke() throws Throwable {
        ImportCrmData.start();
    }
});
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27360810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档