Правильный способ обработки сессии в спящем режиме

Мой код работает, я просто хочу знать, хорошо ли он написан и что я должен изменить. Я использовал другой метод для выбора MySQL, с Hibernate HQL и с Criteria. Главным образом, чтобы научиться использовать их. Другой вопрос касается сессии Hibernate, я не знаю, правильно ли я ее использую.

У меня есть этот класс создания сеанса:

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {               
            //VER HIB 4
            Configuration configuration = new Configuration().configure();
            StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().
            applySettings(configuration.getProperties());

            SessionFactory sf = configuration.buildSessionFactory(builder.build());

            return sf;          
        }
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

И я создал класс DAO:

public class CreazioneUtenzaDAO extends CommonDAO
{

    public CreazioneUtenzaDAO() {

    }

    public List<Comune> getComuni()
    {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        List<Comune> com = session.createQuery("FROM Comune").list(); 
        session.getTransaction().commit();

        return com;
    }

    public List<Ente> getEntiFromComune(Comune comune) {
        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session session = sf.openSession();
        Criteria cri = session.createCriteria(Ente.class, "ente");
        //join on ente.tipoufficios as tipouff
        cri.createAlias("ente.tipoufficios", "tipouff");
        cri.createAlias("tipouff.ufficios", "uff");
        cri.add(Restrictions.eq("uff.comune", comune));
        cri.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);        
        List <Ente> en = cri.list();
        session.close();

        return en;
    }

    public List<Tipoufficio> getTipoufficioFromComuneEnte(String idComune, String idEnte) 
    {
        String strSql ="SELECT DISTINCT tu "+
                "FROM Tipoufficio tu INNER JOIN tu.ufficios as u "+ 
                "WHERE u.comune.codComune= :idComune AND tu.ente.idEnte= :idEnte "
                +"order by tu.descrizione";

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Query query = session.createQuery(strSql);
        query.setParameter("idComune", idComune);
        query.setParameter("idEnte", idEnte);

        List<Tipoufficio> list = query.list();
        session.close();
        return list;
    }

    public List<Ufficio> getUfficiFromComuneEnteTipoufficio(String idComune,
            String idEnte, String codTipoUfficio) {
        String strSql ="SELECT DISTINCT u  "+
                "FROM Ufficio as u INNER JOIN u.tipoufficio as tu "+ 
                "WHERE u.comune.codComune= :idComune AND tu.ente.idEnte= :idEnte AND tu.idTipoUfficio= :codTipoUfficio "
                +" order by u.descrizione ";

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Query query = session.createQuery(strSql);
        query.setParameter("idComune", idComune);
        query.setParameter("idEnte", idEnte);
        query.setParameter("codTipoUfficio", codTipoUfficio);
        List<Ufficio> list = query.list();
        session.close();
        return list;
    }

    public List<Email> getEmails() 
    {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        List<Email> tmp = session.createQuery("FROM Email").list();         
        session.getTransaction().commit();
        return tmp;
    }

    public List<Applicazione> getApplicazioni() 
    {
        return selectAll("Applicazione");
    }

    public List<Qualifica> getQualifiche() {
        return selectAll("Qualifica");
    }
}

Правильно ли я открываю, закрываю, начинаю и фиксирую транзакцию? Или я должен, например, открыть и закрыть сеанс как раз вовремя? Какая лучшая практика?

2 ответа

Рекомендуем взглянуть на использование Spring с Hibernate. Он автоматизирует множество задач обработки сеансов.

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html

Для примера, использующего этот подход:

http://examples.javacodegeeks.com/enterprise-java/spring/jpaorm/spring-hibernate-mysql-and-maven-showcase/

 u.comune.codComune='"+idComune+"'

это просто запрос на инъекцию sql. используйте.setParameter, чтобы избежать этого.

Другие вопросы по тегам