Можете ли вы использовать CDI?Вы можете написать небольшой класс, который будет вставлен во все различные контексты, а затем предоставит их вашим классам через метод продюсера, который выполняет некоторую логику.Немного похоже на это:
public class PersistenceContext {
@PersistenceContext(unitName="myUnit") private EntityManager myEm;
@PersistenceContext(unitName="yourUnit") private EntityManager yourEm;
@Produces
public EntityManager getEntityManager(InjectionPoint ip) {
if (USER IS ME) {
return myEm;
}
else if (USER IS YOU) {
return yourEm;
}
else {
NOW PANIC AND FREAK OUT
}
}
}
Тогда вы можете просто написать классы следующим образом:
public class FeedReamer {
@Inject private EntityManager em;
}
И все волшебным образом произойдет правильно (возможно?).
Если выЕсли вы не хотите жестко кодировать имена единиц персистентности в классе, вместо того, чтобы полагаться на внедрение, вы можете явно получить фабрики диспетчера сущностей:
@Produces
public EntityManager getEntityManager(InjectionPoint ip) {
String persistenceUnitName = somehowDeterminePersistenceUnitName();
EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistenceUnitName);
return emf.createEntityManager();
}
Однако, хотя этот метод будетработа в приложении J2SE, Persistence.createEntityManagerFactory не гарантирует работу в J2EE.Сноска 42 в спецификации (по крайней мере, в спецификации персистентности EJB 3.0) гласит:
Использование этих API начальной загрузки Java SE может поддерживаться в контейнерах Java EE;однако поддержка такого использования не требуется.
Кроме того, я считаю, что создание нового EntityManagerFactory может быть довольно медленным;Вы можете найти, что вам нужно кэшировать результаты поиска.Я полагаю, что можно безопасно удерживать EntityManagerFactory в течение длительного времени и получать к нему доступ из нескольких потоков (но я не уверен).