2013-05-16 28 views
11

W projekcie z zastosowaniem JPA, że powszechnie stosowanyJaka jest różnica między @Inject a @PersistenceContext?

@Inject EntityManager em; 

w celu uzyskania takiego obiektu. Widziałem, że wiele fragmentów kodu w internecie zamiast używać:

@PersistenceContext EntityManager em; 

Jaka jest różnica między tymi opcjami?

Mój kod działa na JBoss EAP 6.1 i Hibernate.

Odpowiedz

6

@PersistenceContext jest specyficznym adnotacja, który deklaruje zależność od kierownika jednostki pojemnika zarządzane. Pozwala określić więcej parametrów, takich jak typ utrwalania. Ustawienie typu utrwalania na EXTENDED jest ważne, gdy chcesz zachować kontekst utrwalania dla całego cyklu życia stateful komponentu bean sesji. @PersistenceContext to adnotacja JPA.

@Inject to adnotacja CDI. Jest bardzo ogólny i może służyć do wstrzykiwania wielu różnych przedmiotów.

5

@PersistenceContext jest bardzo szczegółową adnotacją i mówi "wstrzyknij to pole z kontekstem trwałości". Nie można jej używać poza zarządzanym kontekstem.

z drugiej strony jest bardzo ogólny. Mówi "powinieneś wstrzyknąć to pole". Nie musi to być kontekst utrwalania, ale wszystko, co chcesz zdefiniować jako wstrzyknięte.

This article (co nie jest dokładnie jabłkiem dla jabłek, o które prosisz) może rzucić więcej światła na ciebie.

Jeśli chcesz, aby przejść bezpośrednio do źródła co @Inject jest you can read the spec here:

@Inject, identyfikuje się punkt, w którym zależność od klasy Java lub interfejs może być wstrzykiwany. Następnie pojemnik zapewnia potrzebny zasób. W tym przykładzie komponent bean logowania określa dwa punkty wtrysku.

+0

Podoba mi się twoja odpowiedź, ale jakie są konsekwencje wyboru jednej opcji zamiast drugiej? –

+0

Nie wiem :(To wszystko, co mogłem znaleźć w tej sprawie. –

0

@Inject dostarczy ci to, co pojemnik uzna za EntityManager, mam nadzieję, że jest tylko jeden.

Jeśli jednak masz więcej niż jeden, musisz przejść przez niektóre adnotacje kwalifikacyjne i mieć coś, co je dla ciebie wyprodukuje, lub możesz przekazać atrybut unitName do adnotacji @PersistenceContext.