2013-05-16 3 views
11

В проекте с использованием JPA, я обычно используюВ чем разница между @Inject и @PersistenceContext?

@Inject EntityManager em; 

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

@PersistenceContext EntityManager em; 

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

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

ответ

6

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

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

5

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

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

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

Если вы хотите, чтобы идти прямо к источнику, что @Inject есть you can read the spec here:

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

+0

Мне нравится ваш ответ до сих пор, но каковы последствия выбора одного варианта вместо другого? –

+0

Я не знаю :(Это все, что я мог найти по этому вопросу. –

0

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

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

Смежные вопросы