hibernação solução preguiçoso. Está certo?
-
16-09-2019 - |
Pergunta
Eu estou usando a seguinte abordagem para resolver o problema de inicialização lenta em hibernação. Por favor me diga se ele vai funcionar ou não. Eu tenho que implementar minha transcation na minha persistência camada compulsary devido a algumas razões.
public class CourseDAO {
Session session = null;
public CourseDAO() {
session = HibernateUtil.getSessionFactory().getCurrentSession();
}
public Course findByID(int cid) {
Course crc = null;
Transaction tx = null;
try {
tx = session.beginTransaction();
Query q = session.createQuery(
"from Course as course where course.cid = "+cid+" "
);
crc = (Course) q.uniqueResult();
//note that i am not commiting my transcation here.
//Because If i do that i will not be able to do lazy fetch
}
catch (HibernateException e) {
e.printStackTrace();
tx.rollback();
throw new DataAccessLayerException(e);
}
finally {
return crc;
}
}
}
e no filtro eu estou usando o código folling
session = HibernateUtil.getSessionFactory().getCurrentSession();
if(session.isOpen())
session.getTransaction().commit();
É este o caminho certo? ele pode pode ter qualquer problema.
Solução
Certifique-se de que você sempre confirmação ou reversão e, em seguida, sempre perto da sua sessão. Basicamente, os seus recursos (transação e sessão) deve ser liberado não importa o que, por exemplo, eles podem ser colocados dentro de apropriada finalmente bloquear (no caso de sessão) ou em ambos os blocos try e catch (no caso de transacção).
Em geral, a alocação e liberação de recursos em diferentes camadas de aplicação é anti-padrão - Se sua arquitetura forças você em aplicação de anti-padrão, em seguida, há mais perguntas a fazer aqui ... Por exemplo, pense no que você deve fazer no seu "filtro" se a sessão acontece a ser fechado ...