Хорошо, поскольку никто не получил ответа, я снова посмотрел на вопрос и код и немного погуглил.
Факт 1: плагин поддерживается только до Struts 2.1.6, кроме того, я использую новый Tomcat 7, поэтому я предположил, что что-то может просто не работать с плагином.
Факт 2: Кто-то на форуме Hibernate указал, что эта проблема может возникнуть, если вы попытаетесь получить доступ к сеансу вместо открытия нового : Hibernate Forum: Session is Закрыто! (раствор внизу)
Кажется, что факт 1 приводит к тому, что аннотации @session
и @transaction
работают неправильно, или я их неправильно использовал, поскольку они часто были нулевыми в моем методе prepare, который является таким классом и из которого все Мои действия в Struts2 получены:
public abstract class ActionHelper extends ActionSupport implements Preparable, ...
В этом классе я использовал следующие аннотации, которые обычно работали во всех других проектах (Struts 2.1.6 и Tomcat 6):
@SessionTarget
Session db;
@TransactionTarget
Transaction transaction;
private FeedGroupDAO _feedGroupDao;
В методе prepare у меня был защитный программный код, который проверял, был ли сеанс нулевым, а затем заменял его текущим сеансом гибернации. Проблема заключалась в том, что этот сеанс часто закрывался, что вы можете узнать, если спросите if (!session.isOpen())
Поэтому теперь я использую следующий код в своем методе prepare в классе 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
Метод плагина getNewSession()
, похоже, использует внутреннее значение openSession()
Hibernate, поэтому, похоже, это рабочее решение форумов Hibernate. Кроме того, он по-прежнему поддерживает шаблон OpenSessionInView, поскольку Struts2-fullhibernate-plugin управляет сеансом и транзакцией, полученными из статического метода getNewSession()
. В качестве заметки я стараюсь как можно скорее перейти от защитного программирования к созданию исключений; -)
Надеюсь, это поможет вам.