我正在使用以下方法来解决hibernate中的延迟初始化问题。请告诉我它是否有效。由于某些原因,我必须在我的持久层强制实施我的交易。
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;
}
}
}
在过滤器中我正在使用下拉代码
session = HibernateUtil.getSessionFactory().getCurrentSession();
if(session.isOpen())
session.getTransaction().commit();
这种方法对吗?可以有任何问题。
答案 0 :(得分:0)
确保始终提交或回滚,然后始终关闭会话。基本上,您的资源(交易和会话)应该被释放,无论如何,例如,它们可以放在适当的finally块(在会话的情况下)或try和catch块(在事务的情况下)中。
一般来说,跨不同应用程序层的资源分配和释放是反模式的 - 如果你的架构强迫你应用反模式,那么在这里有更多的问题要问......例如,想想你应该做什么在你的“过滤器”中,如果会话恰好被关闭......