好的,因为没有人得到答案,所以我再次调查了问题和代码,然后在谷歌上搜索了一下。
事实1:该插件仅在Struts 2.1.6之前受支持,此外,我正在使用新的Tomcat 7,因此我猜想某些问题可能不适用于该插件。
事实2:某个Hibernate论坛中的某人指出,如果您尝试访问该会话而不是 打开一个新 会话,则会出现此问题:Hibernate Forum:Session is Closed!(底部附近的解决方案)
似乎事实1导致注释的出现
@session而
@transaction无法正常工作,或者我在错误地使用它们,因为它们在我的prepare方法中经常为null,此类方法是此类,并且我所有的struts2动作都源自该注释:
public abstract class ActionHelper extends ActionSupport implements Preparable, ...
在本课程中,我使用了以下注释,这些注释到目前为止通常在所有其他项目(Struts 2.1.6和Tomcat 6)中都有效:
@SessionTargetSession db;@TransactionTargetTransaction transaction;private FeedGroupDAO _feedGroupDao;
在prepare方法中,我具有防御性的编程代码,该代码检查会话是否为null,然后将其替换为当前的hibernate会话。问题是,本次会议经常关闭,如果您问
if(!session.isOpen())
因此,现在在ActionHelper类的prepare方法中使用以下代码:
public void prepare() throws Exception { // initialize DAO Objects with Session and Transaction if (session == null) { session = com.googlepre.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getNewSession(); if (!session.isOpen()) throw new NullPointerException("Fix the pre: session's not here"); transaction = session.beginTransaction(); } _feedGroupDao = new FeedGroupDAO(session,transaction); // init more DAOs with the same session/transaction该
getNewSession()插件的方法似乎在
openSession()内部使用了Hibernate
,因此这似乎是Hibernate论坛的有效解决方案。另外,由于struts2-fullhibernate-
plugin管理从静态
getNewSession()方法获得的会话和事务,因此它仍支持OpenSessionInView模式。作为附带说明,我尝试从防御性编程转移到尽快抛出异常;-)
希望这可以对您有所帮助。



