Почти. Вам нужен только один EntityManagerFactory на единицу персистентности.
Как бы вы обеспечили наличие только одного EntityManagerFactory на единицу персистентности?
Обычно разработчики создают вспомогательный класс с одноэлементным EntityManagerFactory, например
public class EntityManagerFactoryHelper {
private static EntityManagerFactory factory;
static {
try {
// Set up factory right here
} catch(ExceptionInInitializerError e) {
throw e;
}
}
public static EntityManagerFactory getFactory() {
return this.factory;
}
}
EntityManager , с другой стороны, используется для взаимодействия с набором экземпляров управляемого объекта, который называется контекстом постоянства.
Если вы хотите знать, почему я использую ErrorInInitializerError , его API понятен
Сигналы о том, что в статическом инициализаторе
произошло непредвиденное исключение
...
Это хороший способ инициализации менеджера сущностей?
Ну, сервисный уровень используется для разграничения границы транзакции . Таким образом, для каждого варианта использования , вы можете создать свой EntityManager и передавать по ссылке для каждого колаборатора , необходимого для выполнения вашего варианта использования.
public static br.com.helper.EntityManagerFactoryHelper.getFactory;
public EmployeeService {
public void doSomething() {
EntityManager eManager = getFactory().createEntityManager();
eManager.getTransaction().begin();
EmployeeRepository repository = new EmployeeRepository(eManager);
eManager.getTransaction().commit();
}
}
Теперь представьте, что вам нужен код шаблона, показанный выше для каждого варианта использования.
public void forEachUseCase() {
// Create an EntityManager
// Begin a Transaction
EmployeeRepository repository = new EmployeeRepository(eManager);
// And finally, commit
}
Вы можете положиться на Spring , чтобы помочь вам избавиться от этого стандартного кода.