Spring oraz DAO z typami generycznymi

0

Witam serdecznie
chcąc zautomatyzować proces tworzenia obiektów dao postanowiłem pobawić się trochę typami generycznymi.
Znalazłem Ciekawy przykład na necie ale nie wiem dlaczego nie działa tak jak powinien ?

Już spieszę z wyjaśnieniami . Po pierwsze używam sprringa ver 3.1.1 oraz Jboss as 7 .. .
moje dao bazowe od którego dziedziczą inne wygląda następująco :

public abstract class DAO<T, I extends Serializable> implements IDAO<T, I>
{
   Class<T> clazz;
   //jeden domyślny konstruktor który musi być nadpisany w nadklasie
   public DAO(Clazz<T> clazz)
   {
	this.clazz = clazz        
   }
	@Override
	public T findById(I id)
	{
		return this.entityManager.find(clazz, id);
	}

	......

	public void save(T object)
	{
		entityManager.persist(object);
	}

}
 

Przykładowa nadklasa:

public class PersonDAO extends DAO<TPerson, Integer> implements IPersonDAO
{	
	//Konstruktor domyślny automatycznie wywoływany po wstrzyknięciu w springu
	public PersonDAO()
	{
		super(TPerson.class);
	}

	public void register(TPerson p)
	{
		entityManager.persist(p);
	}

}

Co jest najdziwniejsze mam testy jednostkowe JUnit które są wykonywane w trakcie budowy projektu
i zarówno metoda register(TPerson p) jak i metoda save (T object ) działąją poprawnie !!

Natomiast jeśli chcę te metody użyć w ciele mojego kontrolera (@Controller) to metoda register działa poprawnie
zapisuje encje do bazy danych , natomiast metoda **save ** już nie działa ....?????

Pierwszy raz spotkałem się z taką sytuacją aby metoda działała podczas wykonywania testów jednostkowych natomiast nie działała w systemie , nie wiem czy ma to związek z użyciem typów generycznych czy jest inny powód :/

co najśmieszniejsze metoda save nie wyrzuca też żadnych wyjątków ?? A może ma to związek z tworzeniem klucza przez hibernate ??

0

Jak się okazało jest problem bug na serverze oto odpowiedz:

Have a look at DAOS AREN'T DEAD - BUT THEY EITHER COLLAPSED OR DISAPPEARED. I think Gavin King has made similar remarks although I can't find the reference right now.

That fact that your unit test works and application does not may be a consequence of a JPA integration bug that I recall being mentioned here sometime back. I believe that the EntityManager should have still executed your data operation, even in the absence of an explicit transaction (which is not a recommended scenario BTW). Try it out on one of the nightly builds.

oto rozwiązanie :
@Transactional
public abstract class GenericDAO <T , PK extends Serializable> implements IGenericDAO<T, PK>

Swoją drogą nie wiedziałem, że dao nie cieszy się już taką popularnością jak kiedyś .. .

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