Правильный способ обработки сессии в спящем режиме
Мой код работает, я просто хочу знать, хорошо ли он написан и что я должен изменить. Я использовал другой метод для выбора 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
Для примера, использующего этот подход:
u.comune.codComune='"+idComune+"'
это просто запрос на инъекцию sql. используйте.setParameter, чтобы избежать этого.