В текущей версии JPA, к сожалению, динамическое создание единиц постоянства невозможно. Если эта функциональность важна для вас, вы можете рассмотреть вопрос о создании проблемы JIRA для нее в системе отслеживания проблем JPA: http://java.net/jira/browse/JPA_SPEC
Используя аннотацию @PersistenceContext
, также невозможно динамически выбрать конкретную единицу сохранения. На самом деле это область шардинга, которую Hibernate однажды попытался решить, но затем внезапно прекратил. Смотри http://www.hibernate.org/subprojects/shards.html
Однако есть несколько вещей, которые вы могли бы сделать, чтобы получить подобный эффект.
Один из подходов заключается в создании фабричного компонента EJB / CDI без сохранения состояния, который вы вводите всем своим менеджерам сущностей. Стоимость этого незначительна, так как эти компоненты будут объединены, а менеджеры сущностей не так уж и дороги для создания в первую очередь.
Если вы также хотите внедрить их на основе какого-либо условия, тогда это условие должно быть доступно из контекста или должно быть указано в точке внедрения (но если вы сделаете это, вы можете также ввести Право менеджера организации напрямую).
Пример запуска:
@Stateless
@TransactionAttribute(SUPPORTS)
public class ShardingEntityManagerFactory {
@Resource
private SessionContext sessionContext;
@PersistenceContext(unitName = "pu1")
private EntityManager entityManager1;
@PersistenceContext(unitName = "pu2")
private EntityManager entityManager2;
@Produces @TransactionScoped @ShardedPersistenceContext
public EntityManager getEntityManager() {
if (sessionContext.isCallerInRole("FOO")) {
return entityManager1;
} else {
return entityManager2;
}
}
}
А потом в твоих бобах:
@Stateless
public class SomeBean {
@Inject @ShardedPersistenceContext
private EntityManager entityManager;
// ...
}
Обратите внимание, что для аннотации @TransactionScoped
вам понадобится постоянство шва. Также было бы проще, но немного более многословно, забыть о прозрачном введении менеджера сущностей, вместо этого ввести ShardingEntityManagerFactory
и получить из него нужный вручную.