В чем разница между @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 надеюсь, есть только один.

Однако, если у вас есть более одного, вам нужно будет пройти через некоторые аннотации квалификатора и получить что-то для вас, или вы можете передать unitName приписать @PersistenceContext аннотаций.

Другие вопросы по тегам