2016-07-14 4 views
0

Я пишу фреймворк, который нужно связать с единицей сохранения, предоставленной пользователем. Ранее менеджер объект был введен с использованием @PersistenceContext аннотацию, но это статический способ:Как внедрить EntityManager динамически?

public class MyItemReader implements ItemReader { 

    @PersistenceContext(unitName="myPU") 
    private EntityManager em; 

    ... 
} 

Теперь я хочу, назначение быть динамичным. Таким образом, независимо от того, что такое имя единицы продолжительности, связанный с ним менеджер объектов все еще может быть найден. Вот моя реализация:

public class MyItemReader implements ItemReader { 

    private EntityManager em; 

    @Inject @BatchProperty 
    private String persistenceUnitName; 

    @Override 
    public void open(Serializable checkpoint) throws Exception { 
     String path = "java:comp/env/" + persistenceUnitName; 
     em = (EntityManager) InitialContext.doLookup(path); 
     ... 
    } 

    ... 
} 

Моя реализация работает в WildFly, но я не уверен, что он работает в другом контейнере Java EE. И я не уверен, что это работает, когда исходный контекст изменился.

Итак, моя реализация - хороший подход?

+1

Это хорошо, только будьте осторожны, что некоторые контейнеры имеют различное JNDI опубликовать имя, но вы можете связать путь базы JNDI к свойству @Resource инициализировано с дескрипторами развертывания – fantarama

ответ

-1

Не нужно указывать имя единицы в persistanceContext. Попробуйте ниже одного.

@PersistenceContext 
    public void setEntityManager(EntityManager entityManager) { 
     this.entityManager = entityManager; 
    } 

Он будет работать.

Благодаря

+1

Если пользователь имеет более чем один PU, то какой из них будет выбран в этом случае? –

+0

В этом случае попробуйте присвоить имя элемента @PersistenceContext (unitName = "$ {persistence.UnitName}") добавить persistence.UnitName в свои свойства. это будет работать. – Umamaheswar

Смежные вопросы