spring / hibernate: otwórz / zamknij sesję za każdym razem VS getCurrentSession

Jakie są różnice między tymi podejściami, a które lepsze? Do tej pory mam fragmenty kodu w następujący sposób:

public void delete(Song song) {
    session = sessionFactory.getCurrentSession();
    session.delete(song);
    session.flush();
}

ale rekord nie jest zawsze usuwany po uruchomieniu powyższego kodu (dokładnie: id = 1 nigdy nie jest usuwany, a inne identyfikatory są zawsze usuwane). Czytałem, że utrzymywanie otwartej sesji trochę przyspiesza aplikację - dlatego udostępniam obiekt sesji. Mój obiekt biznesowy pobiera fabrykę sesji przez DI:

@Autowired
private SessionFactory sessionFactory;

Session session = null;

public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}

questionAnswers(1)

yourAnswerToTheQuestion