Czy zdarza się, że w standardowej aplikacji internetowej występuje przypadek, w którym jako wywołanie DAO przekazuje się EntityManager lub sesję jako parametr, tj. findPersonByName(String name, Session session)
? A może otwarcie i zakończenie sesji powinno być abstrakcyjne we wdrożeniu?
Odpowiedzi:
7 dla odpowiedzi № 1Lepszym rozwiązaniem byłoby zainicjowanie lub w inny sposób wstrzyknięcie DAO za pomocą SessionFactory
. Następnie możesz robić takie rzeczy:
public abstract class AbstractHibernateDao<T extends Object>
implements AbstractDao<T> {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
public void save(T t) { getSession().save(t); }
public void update(T t) { getSession().update(t); }
...
}
bez konieczności zdawania Session
s wszędzie.
0 dla odpowiedzi nr 2
Nie, nigdy nie należy go używać, tylko warstwę usługimoc. Wyobraź sobie, że masz dwie różne metody (w możliwie różnych DAO), które muszą być zawarte w tej samej transakcji (zatwierdzanie / wycofywanie), niż możesz / musisz użyć tego samego obiektu połączenia.