题
我使用下面的方法来解决在休眠延迟初始化的问题。请告诉我它是否会工作或没有。我要实现我的transcation在我的持久性层必须放由于某些原因。
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;
}
}
}
和在过滤器中,我使用的folling代码
session = HibernateUtil.getSessionFactory().getCurrentSession();
if(session.isOpen())
session.getTransaction().commit();
时,这种做法对吗?它可以可具有任何问题。
解决方案
请确保您始终提交或回滚,然后总是关闭会话。基本上,你的资源(交易和会话)应该不管是什么,例如释放可以将它们放在合适的最后块的内部(在会话的情况下)或在两个try和catch块(在交易的情况下)。
在一般情况下,分配和跨不同应用层资源的释放是反模式 - 如果你的架构逼着你去申请反模式则有更多的问题要问这里...例如,想你应该做些什么在你的“过滤器”,如果会议恰好被关闭......
不隶属于 StackOverflow