В чем разница между @Inject и @PersistenceContext?
в проекте, использующем JPA, я обычно использую
@Inject EntityManager em;
для того, чтобы получить такой объект. Я видел, что многие фрагменты кода в интернете вместо этого используют:
@PersistenceContext EntityManager em;
в чем разница между этими вариантами?
мой код работает на JBoss EAP 6.1 и Hibernate.
3 ответов
@PersistenceContext
- это конкретная аннотация, которая объявляет зависимость от диспетчера сущностей, управляемого контейнером. Это позволяет указать больше параметров, таких как тип персистентности. Установка типа персистентности EXTENDED важна, если вы хотите сохранить контекст персистентности для всего жизненного цикла компонента сеанса с сохранением состояния. @PersistenceContext
является аннотацией JPA.
@Inject
является аннотацией CDI. Это очень универсальный и может быть использован для нагнетания различных объектов.
@PersistenceContext является очень конкретной аннотацией, и она говорит: "введите это поле с контекстом персистентности". Вы не можете использовать его вне управляемого контекста.
@Inject С другой стороны, очень общий. Он говорит: "Вы должны ввести это поле."Это не обязательно для контекста настойчивости, но все, что вы хотите определить как введенное.
в этой статье (что не совсем яблоки к яблокам чего вы просите) может пролить больше света на это для вас.
Если вы хотите пойти прямо к источнику того, что @Inject,вы можете прочитать спецификацию здесь:
@Inject, определяет точку, в которой может быть введена зависимость от класса Java или интерфейса. Затем контейнер предоставляет необходимый ресурс. В этом примере компонент Login указывает две точки инъекции.
@Inject
даст вам то, что контейнер считает EntityManager
надеюсь, есть только один.
однако, если у вас есть более одного, вам придется пройти через некоторые аннотации квалификатора и что-то произвести его для вас, или вы можете пройти в до @PersistenceContext
Примечание.