Как указано в заголовке, почему использование CDI (внедрение контекстов и зависимостей) для внедрения EntityManager
(с использованием аннотации Producer и @Inject
) считается хорошей практикой? Почему это лучше, чем использование аннотации @PersistenceContext
? Я читал, что это предпочтительная реализация, но не могу понять, почему.
EntityManager внедряет передовой опыт
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
Спасибо за объяснение! Я также читал, что внедрение через PersistenceContext не является потокобезопасным - это правильно?
- person Adam; 01.06.2018
@Adam
EntityManager
не является потокобезопасным. Но вы должны прочитать этот ответ для получения дополнительной информации.
- person cassiomolin; 01.06.2018
@Adam Адам Вопрос в том, зачем вам потокобезопасность. Обычно контейнер контролирует, что выполняется в параллельных потоках и какие экземпляры являются общими. В этом случае вам не нужно беспокоиться о потокобезопасности внедренных EntityManager-Instances. Каждый поток будет работать, используя свою собственную транзакцию и, следовательно, свой собственный EntityManager.
- person aschoerk; 05.06.2018