EntityManager внедряет передовой опыт

Как указано в заголовке, почему использование CDI (внедрение контекстов и зависимостей) для внедрения EntityManager (с использованием аннотации Producer и @Inject) считается хорошей практикой? Почему это лучше, чем использование аннотации @PersistenceContext? Я читал, что это предпочтительная реализация, но не могу понять, почему.


person Adam    schedule 01.06.2018    source источник
comment
В качестве примечания: CDI означает контексты и внедрение зависимостей.   -  person mtj    schedule 02.06.2018


Ответы (1)


CDI — это стандартная технология внедрения зависимостей в Java EE и это делает удобным создание производителя метода для EntityManager, тогда вы можете просто внедрить его в свои bean-компоненты.

Аннотация @PersistenceContext имеет ряд настраиваемых элементов ( например name), и вы например, может не хотеться дублировать их по всему приложению.

Внедрение CDI особенно полезно, когда у вас есть несколько единиц сохраняемости. Затем вы можете воспользоваться квалификаторами CDI для внедрения:

public class Databases {

    @Produces @Users 
    @PersistenceContext(unitName="UserData")
    EntityManager userEntityManager;

    @Produces @Documents
    @PersistenceContext(unitName="DocumentData")
    EntityManager docDatabaseEntityManager;
}
@Inject @Users
EntityManager em;
@Inject @Documents
EntityManager em;
person cassiomolin    schedule 01.06.2018
comment
Спасибо за объяснение! Я также читал, что внедрение через PersistenceContext не является потокобезопасным - это правильно? - person Adam; 01.06.2018
comment
@Adam EntityManager не является потокобезопасным. Но вы должны прочитать этот ответ для получения дополнительной информации. - person cassiomolin; 01.06.2018
comment
@Adam Адам Вопрос в том, зачем вам потокобезопасность. Обычно контейнер контролирует, что выполняется в параллельных потоках и какие экземпляры являются общими. В этом случае вам не нужно беспокоиться о потокобезопасности внедренных EntityManager-Instances. Каждый поток будет работать, используя свою собственную транзакцию и, следовательно, свой собственный EntityManager. - person aschoerk; 05.06.2018