好吧,由于没有人得到答案,我再次研究了这个问题和代码,并用谷歌搜索了一下。
看来事实 1 导致了注释@session
and @transaction
无法正常工作,或者我错误地使用了它们,因为它们在我的准备方法中通常为空,这是一个类,我的所有 struts2 操作都从中派生:
public abstract class ActionHelper extends ActionSupport implements Preparable, ...
在本课程中,我使用了以下通常适用于迄今为止所有其他项目(Struts 2.1.6 和 Tomcat 6)的注释:
@SessionTarget
Session db;
@TransactionTarget
Transaction transaction;
private FeedGroupDAO _feedGroupDao;
在准备方法中,我有防御性编程代码,用于检查会话是否为空,然后将其替换为当前的休眠会话。问题是这个会议经常关闭,如果你问你能找到什么if (!session.isOpen())
因此,现在我在 ActionHelper 类的准备方法中使用以下代码:
public void prepare() throws Exception {
// initialize DAO Objects with Session and Transaction
if (session == null)
{
session = com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getNewSession();
if (!session.isOpen())
throw new NullPointerException("Fix the code: session's not here");
transaction = session.beginTransaction();
}
_feedGroupDao = new FeedGroupDAO(session,transaction); // init more DAOs with the same session/transaction
The getNewSession()
该插件的方法似乎使用Hibernate的openSession()
在内部,因此这似乎是 Hibernate 论坛的工作解决方案。此外,这仍然支持 OpenSessionInView 模式,因为 struts2-fullhibernate-plugin 正在管理从静态获取的会话和事务getNewSession()
方法。作为旁注,我尝试尽快从防御性编程转向抛出异常;-)
希望这可以帮助你。