Обновление
Это точнее, чем то, что показано ниже:
JPAPlugin.startTx(false);
// Do your stuff
JPAPlugin.endTx(false);
Была похожая проблема сегодня.
Вынеобходимо создать новый EntityManager
и транзакцию для каждого потока и установить его в JPA class.
Play использует ThreadLocal
, чтобы сохранить EntityManager
в JPA , так что это ноль для вашего созданного потока.К сожалению, вы не можете использовать вспомогательные методы в JPA , чтобы сделать это (они являются частными пакетами), и вы должны использовать ThreadLocal
напрямую.Вот как вы можете это сделать:
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();
}
}
Я использую его с однопоточным исполнителем из java.util.concurrent без проблем.