Separacja EJB JPA - Problem

0

Witam,

Staram poradzić sobie z następującym problemem:
Posiadam projekt EJB(z całą implementacją, kontekstem persystencji), beany wstrzykują EntityManager'a do obiektów DAO(przez konstruktor) z innego projektu, gdzie są opisane encję i metody utrwalania danych(JPA).

Problem polega na tym, że obiekty DAO nie dostają prawidłowo EntityManagera i każda operacja na nim kończy się Null Pointer Exc.

Jeśli całą logikę związaną z EntityManagerem zamknę bezpośrednio w metodach beanów wszystko ładnie działa.
PersistenceContext jest ok.

Chciałem podzielić EJB między JPA, żeby łatwiej było napisać sobie testy.
Czy ktoś miał kiedyś podobny problem?

Zaznaczam, że persistence.xml oraz datasource w JBoss jest dobrze opisany.
Korzystam z biblioteki: hibernate-jpa-2.0-api-1.0.1.Final.jar

Próbowałem również pobierać bezpośrednio EntityManagera przez adnotacje w projekcie JPA i korzystać z gotowych dao w komponentach EJB, lecz ponownie NLP.

Dziękuje za wszelkie uwagi.

0

Problem rozwiązany.

Trzeba było tworzyć obiekty DAO w metodzie PostConstruct beana.

0

Nie wiem w czym masz problem przecież obiekty DAO jak nazwa wskazuje czyli Data Access Object są to klasy operująca zazwyczaj na 1 encji czyli 1 encja == 1 DAO.

Zazwyczaj ma on operacje CRUD na tej encji + ew wywoływanie metod dla danej encji czyli @NamedQuery @NativeQuery itp.

piszesz sobie np :

@Stateles
public class PersonDAO implements PersonDAOLocal {
	@PersistenceContext(unitName="test.ejb") //nazwa z persistence.xml
	private EntityManager em.

	@Overrid
	public void create(Person p ){
		em.persist(p);
	}

	.... itd itp
}

Pierwszy raz słysze o używaniu metody @PostConstruct do tworzenia obiektów DAO ??

0

Bo malo widziales. Ty stworzyles DAO w warstwe serwisow (twoj DOA to Stateless session bean); sa ludzie, i to calkiem sporo, ktorzy oddzielaja te 2 warstwy: jpa -> dao -> serwisy -> gui. Zatem owszem, DAO mozna tworzyc. Ja jednakze uzylbym DI.

0

Ja bym jednak zrobił dao singletonowym beanem a nie zwykłym stateless session ;)

0

Ot, pierwsze lepsze wyniki wyszukiwania na stackoverflow:
http://stackoverflow.com/questions/3882108/dao-and-service-layers-jpa-hibernate-spring
http://stackoverflow.com/questions/1079114/spring-transactional-annotation-best-practice
W obu watkach pytanie jest nie o to jak zrobic; pytanie jest o best practices w przypadku warst uslug i dao.
Tutaj z kolei artykul Adama Biena ktory pokazuje ujednolicenie tych 2 warstw:
http://www.adam-bien.com/roller/abien/entry/generic_crud_service_aka_dao
Wiec i tak sie robi (moj pierwszy komentarz nie mial na celu implikacji ze tak jest zle, tylko zaznaczeniu, ze nie zawsz tak jest i nie zawsze ma tak byc).

Moja zasada jest taka - jesli program jest prosty, to nie ma co przekombinowywac i tworzyc warstw - dao jako ejb jest ok. Ale jesli dana usluga ma korzystac z wielu typow encji, to wole zrobic osobne, pojo dao ktore nie wiedza nic o transakcjach, wstrzykiwac je do jakiegos serwicu ktorego metody sa transakcjonalne. Ten serwis to albo EJB, albo jakis Spring Bean z @Transactional, albo cokolwiek. W ten sposob dao nie zakladaja nic na temat transakcji, i obowiazek oznaczania ich granic lezy po stronie serwisu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1