JPA and Threads in play framework

后端 未结 4 1925
Happy的楠姐
Happy的楠姐 2021-01-11 18:07

I\'m trying to create a multithreading server. The problem is that I get the following error: play.exceptions.JPAException: The JPA context is not initialized. JPA Entit

4条回答
  •  隐瞒了意图╮
    2021-01-11 18:26

    Update

    This is neater than what's below:

    JPAPlugin.startTx(false);
    // Do your stuff
    JPAPlugin.endTx(false);
    

    Had similar problem today.

    You have to create new EntityManager and transaction for each thread and set it in JPA class.

    Play uses ThreadLocal to keep it's EntityManager in JPA, so it's null for your created thread. Unfortunately you cannot use helper methods in JPA to do it (they are package private) and you have to use ThreadLocal directly. Here's how you can do this:

    class Runner extends Runnable {
         @Override
         public void run() {
             if (JPA.local.get() == null) {
                 EntityManager em = JPA.newEntityManager();
                 final JPA jpa = new JPA();
                 jpa.entityManager = em;
                 JPA.local.set(jpa);
             }
    
             JPA.em().getTransaction().begin();
             ... DO YOUR STUFF HERE ...
             JPA.em().getTransaction().commit();
         }
    }
    

    I use it with single thread executor from java.util.concurrent without any problems.

提交回复
热议问题