2009-02-28 4 views

Antwort

7

Ein besserer Ansatz wäre, das DAO mit dem SessionFactory zu initialisieren oder anderweitig zu injizieren. Dann können Sie Dinge tun, wie folgt:

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); } 

    ... 
} 

ohne Session s überall passieren zu müssen.

+0

Ja, ich wollte eine 'EntityManagerFactory' verwenden. Ich habe mich nur gefragt, ob es jemals einen Fall gab, bei dem ein 'EntityManager' initialisiert und außerhalb des Service übergeben wurde. Auch mit der 'getSession()' Methode, wo/wann wird die aktuelle Sitzung initialisiert? – jtgameover

+0

Nun, es ist schwer "niemals" zu sagen, aber das möchte ich sagen. Die Standardpraxis besteht darin, dass der Service die Transaktionsverwaltung einkapselt, und die Sitzungstafel (Öffnen/Schließen usw.) typischerweise im Kontext des Transaktionsmanagements ... [mehr] –

+0

Es gibt ein paar Ansätze hier. Eine Art wäre es, eine Art Proxy-Mechanismus zu verwenden (z. B. Spring bietet TransactionManager unterschiedlicher Art an), um Ihre Service-Beans auf transparente Weise zu umbrechen. Der TransactionManager kennt die Factory und behandelt Session-Init. [mehr] –

0

Nein, es sollte nie verwendet werden, aber eine Service-Schicht könnte. Stellen Sie sich vor, Sie haben zwei verschiedene Methoden (in möglicherweise verschiedenen DAOs), die in derselben Transaktion gekapselt werden müssen (Commit/Rollback), als Sie das gleiche Verbindungsobjekt verwenden möchten/müssen.

Verwandte Themen