Запуск транзакции при запуске приложения - не лучшая идея. Транзакции должны быть максимально короткими, поскольку каждая из них блокирует базу данных. Я имею в виду, что каждый раз, когда запускается транзакция, никакой другой поток не может писать в базу данных. То, как вы делаете вещи, с точностью до наоборот: ваша база данных не блокируется только в течение небольших периодов времени. Это вероятная причина ошибки, которую вы получаете.
Обычно рекомендуемый способ управления транзакцией следующий:
EntityManager em = EMF.getEM();
em.getTransaction().begin();
// your persist, merge code goes here
em.getTransaction().commit();
em.close();
Класс ЭДС это:
public class EMF {
private static EntityManagerFactory emf;
static {
emf = Persistence.createEntityManagerFactory("MyEMF");
}
public static EntityManager getEM(){
return emf.createEntityManager();
}
}
Таким образом, ваша транзакция блокирует базу данных только во время выполнения кода сохраняемости. Обратите внимание, что при использовании класса EMF фабрика менеджера сущностей создается только один раз. Это хорошо, потому что создание его вычислительно дорого. Однако, как только он создан, создание экземпляра менеджера сущностей становится очень дешевым. Этот краткий учебник объясняет это довольно хорошо.