В чем разница между @Inject и @PersistenceContext?

В проекте, использующем JPA, я обычно использую

@Inject EntityManager em;

чтобы получить такой объект. Я видел, что многие фрагменты кода в Интернете используют:

@PersistenceContext EntityManager em;

В чем разница между этими параметрами?

Мой код работает на JBoss EAP 6.1 и Hibernate.

Ответ 1

@PersistenceContext - это конкретная аннотация, объявляющая зависимость от управляющего сущностью контейнера. Он позволяет указать больше параметров, таких как тип сохранения. Установка типа persistence EXTENDED важна, когда вы хотите сохранить контекст персистентности для всего жизненного цикла сеансового компонента с состоянием. @PersistenceContext - это аннотация JPA.

@Inject - это аннотация CDI. Он очень общий и может использоваться для инъекции широкого круга объектов.

Ответ 2

@PersistenceContext - очень конкретная аннотация, и она говорит: "Ввести это поле с помощью контекста персистентности". Вы не можете использовать его за пределами управляемого контекста.

@Inject, с другой стороны, очень общий. В нем говорится: "Вы должны ввести это поле". Это не обязательно для контекста персистентности, но все, что вы хотите определить как введенное.

Эта статья (которая не является точно яблоками для яблок того, что вы просите) может пролить больше света на нее для вас.

Если вы хотите прямо перейти к источнику того, что @Inject, вы можете прочитать спецификацию здесь:

@Inject, определяет точку, в которую может быть введена зависимость от класса Java или интерфейса. Затем контейнер предоставляет необходимый ресурс. В этом примере логин-логин указывает две точки впрыска.

Ответ 3

@Inject предоставит вам то, что контейнер считает EntityManager надеюсь, есть только один.

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