Hibernate и Struts2 java.lang.NullPointerException с демонстрацией CRUD - PullRequest
2 голосов
/ 16 марта 2012

У меня есть проект, в котором я использую Hibernate и Struts2 вместе, и я новичок в них обоих.

У меня возникают проблемы при разработке процесса CRUD с комбинациями Hibernate и Struts2.Я хочу сделать это особым образом, но у меня проблемы.Чтобы воспроизвести проблему, возникшую у меня за пределами основного проекта, я скачал WAR из этого учебного пособия и успешно запустил его: http://struts.apache.org/2.x/docs/crud-demo-i.html

Затем я ввел в него Hibernate, внеся следующие изменения:

1) Сначала я добавил к этому JAR-файл из моего реального проекта, чтобы убедиться, что у меня все одинаковые версии.Ключевые моменты: я подаю в суд на Hibernate 3, Struts2 и плагин FullHibernateCore, чтобы связать их.Для более подробной информации, вот JAR, которые я использую:

antlr-2.7.7.jar
commons-collections-3.2.1.jar
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
commons-logging-api-1.1.jar
dom4j-1.6.1.jar
freemarker-2.3.18.jar
hibernate3.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
hibernate-testing.jar
hibernate-validator.jar
javassist-3.15.0-GA.jar
jboss-logging-3.1.0.CR2.jar
jboss-transaction-api_1.1_spec-1.0.0.Final.jar
jta-1.1.jar
log4j-1.2.15.jar
mysql-connector-java-5.1.18-bin.jar
ognl-3.0.4.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar
struts2-core-2.3.1.2.jar
struts2-fullhibernatecore-plugin-2.2.2-GA.jar
xwork-core-2.3.1.2.jar

2) Добавлен hibernate.cfg.xml следующим образом:

<!-- a SessionFactory instance listed as /jndi/name -->
<session-factory>

    <!-- DB Connection Settings -->
    <property name="connection.url">jdbc:mysql://localhost:3306</property>
    <property name="connection.username">root</property>
    <property name="connection.password"></property>
    <property name="hibernate.default_schema">test2</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 

    <!-- DB Dialect -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

    <!-- Echo SQL -->
    <property name="show_sql">true</property>

    <!-- Model Mappings -->
    <mapping class="com.aurifa.struts2.tutorial.model.Employee"/> 
    <mapping class="com.aurifa.struts2.tutorial.model.Department"/> 

</session-factory>

3) Обновлен com.aurifa.struts2.tutorial.model.Department & com.aurifa.struts2.tutorial.model.Employee с аннотацией постоянства.

4) Создан ком.rwblackburn.struts2.tutorial.dao.InitHibernate и выполнил его, чтобы создать исходную БД и заполнить ее теми же данными, что и demo:

package com.rwblackburn.struts2.tutorial.dao;

import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

import com.aurifa.struts2.tutorial.model.Department;
import com.aurifa.struts2.tutorial.model.Employee;

public class InitHibernate {

/**
 * @param args
 */
public static void main(String[] args) {
    AnnotationConfiguration config = new AnnotationConfiguration();
    config.addAnnotatedClass( Employee.class );
    config.addAnnotatedClass( Department.class );
    config.configure("hibernate.cfg.xml");

    // Create annotated class tables
    new SchemaExport(config).create(true, true);

    // Need to be careful with this, move it to a Struts global plugin?
    SessionFactory factory = config.buildSessionFactory();
    Session session = factory.openSession();
    session.beginTransaction();

    session.beginTransaction();

    // Create Departments
    Department dptAccounting = new Department( new Integer(100), "Accounting");
    Department dptRandD = new Department( new Integer(200), "R & D");
    Department dptSales = new Department( new Integer(300), "Sales" );
    session.save(dptAccounting);
    session.save(dptRandD);
    session.save(dptSales);

    // Create Employees
    session.save(new Employee(new Integer(1), "John", "Doe", new Integer(36), dptAccounting));
    session.save(new Employee(new Integer(2), "Bob", "Smith", new Integer(25), dptSales));

    session.getTransaction().commit();

}

}

5) Создан com.rwblackburn.struts2.tutorial.dao.EmployeeHibernateDaoкоторый реализует EmployeeDao

package com.rwblackburn.struts2.tutorial.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.aurifa.struts2.tutorial.dao.EmployeeDao;
import com.aurifa.struts2.tutorial.model.Employee;
import com.googlecode.s2hibernate.struts2.plugin.annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.annotations.TransactionTarget;

public class EmployeeHibernateDao implements EmployeeDao {
@SessionTarget
protected Session session;

@TransactionTarget
protected Transaction transaction;

@SuppressWarnings("rawtypes")
@Override
public List getAllEmployees() {
    return session.createQuery( "from Employee" ).list();
}

@Override
public Employee getEmployee(Integer id) {
    Employee emp = new Employee();
    session.load(emp, id );
    return emp;
}

@Override
public void update(Employee emp) {
    session.update(emp);

}

@Override
public void insert(Employee emp) {
    session.save(emp);
}

@Override
public void delete(Integer id) {
    Employee emp = new Employee();
    session.load(emp, id );
    session.delete(emp);
}

}

6) Создан com.rwblackburn.struts2.tutorial.dao.DepartmentHibernateDao, который реализует DepartmentDao

package com.rwblackburn.struts2.tutorial.dao;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.aurifa.struts2.tutorial.dao.DepartmentDao;
import com.aurifa.struts2.tutorial.model.Department;
import com.googlecode.s2hibernate.struts2.plugin.annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.annotations.TransactionTarget;

public class DepartmentHibernateDao implements DepartmentDao {
@SessionTarget
protected Session session;

@TransactionTarget
protected Transaction transaction;

@SuppressWarnings("rawtypes")
@Override
public List getAllDepartments() {
    return session.createQuery( "from Department" ).list();
}

@SuppressWarnings("rawtypes")
@Override
public Map getDepartmentsMap() {
    Map<Integer, Department> departmentsMap = new HashMap<Integer, Department>();
    Iterator iter = this.getAllDepartments().iterator();
    while( iter.hasNext() ) {
        Department dept = (Department)iter.next();
        departmentsMap.put(dept.getDepartmentId(), dept );
    }
    return departmentsMap;
}

}

7) Обновлен EmployeeDaoService & DepartmentDaoService для использования новых спящих DAO.вместо версии "NoDB" из демоверсии

Теперь InitHibernate работает просто отлично, так что я знаю, что, по крайней мере, так много работает, и сама БД в порядке.Однако, когда я пытаюсь загрузить проект в браузере, страница index.action выдает эту ошибку:

java.lang.NullPointerException
   com.rwblackburn.struts2.tutorial.dao.DepartmentHibernateDao.getAllDepartments(DepartmentHibernateDao.java:26)
    com.aurifa.struts2.tutorial.service.DepartmentDaoService.getAllDepartments(DepartmentDaoService.java:16)
com.aurifa.struts2.tutorial.action.EmployeeAction.prepare(EmployeeAction.java:35)
com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:167)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:192)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:510)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
java.lang.Thread.run(Thread.java:722)

Когда я выполняю трассировку отладки, я могу подтвердить, что переменные Session и Transaction в DepartmentHibernateDao находятся вфакт ноль.

После долгих поисков я нашел эту тему: Плагин Struts2 + Full Hibernate -> Сессия закрыта?

Это похоже на ту же проблему, которую яимел.Однако, даже если я понизил версию Struts до версии 2.1.6, у меня все еще есть проблема. Вот мои новые библиотеки:

 antlr-2.7.2.jar
 commons-collections-3.2.jar
 commons-fileupload-1.2.1.jar
 commons-io-1.3.2.jar
 commons-lang-2.3.jar
 commons-logging-1.0.4.jar
 commons-logging-api-1.1.jar
 commons-validator-1.3.1.jar
 dom4j-1.6.1.jar
 freemarker-2.3.13.jar
 hibernate3.jar
 hibernate-jpa-2.0-api-1.0.1.Final.jar
 hibernate-testing.jar
 hibernate-validator.jar
 javassist-3.15.0-GA.jar
 jboss-logging-3.1.0.CR2.jar
 jboss-transaction-api_1.1_spec-1.0.0.Final.jar
 jta-1.1.jar
 log4j-1.2.15.jar
 mysql-connector-java-5.1.18-bin.jar
 ognl-2.6.11.jar
 slf4j-api-1.6.1.jar
 slf4j-log4j12-1.6.1.jar
 struts2-core-2.1.6.jar
 struts2-fullhibernatecore-plugin-2.2.2-GA.jar
 xwork-2.1.2.jar

Также я реализовал квази-исправление, указанное в этой теме, добавив «if (session == null) ”перед некоторыми вызовами сеанса гибернации.Например:

@SuppressWarnings("rawtypes")
@Override
public List getAllDepartments() {
    if (session == null) {
        System.out.println("****** CREATING SESSION ******");
        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();
    }

    if(!session.isOpen()) {
            System.out.println("****** REOPENING SESSION ******");

            session = session.getSessionFactory().openSession();
            //session = com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getNewSession();
            transaction = session.beginTransaction();
    }

    return session.createQuery( "from Department" ).list();
}

Второй, если я добавлю, чтобы избежать «org.hibernate.SessionException: Session is closed!» На основе вышеупомянутого потока.

Это заставляет меня передать «java.lang.NullPointerException» и «org.hibernate.SessionException: сессия закрыта!» В некоторых случаях, но это не согласуется, если я продолжаю обновлять страницу, она в конечном итоге возвращается,

Вот трассировка стека для этой новой проблемы (вы можете увидеть некоторые из моих строк печати по вышеописанному методу):

[DEBUG] com.opensymphony.xwork2.config.ConfigurationManager.debug:57 - Checking ConfigurationProviders for reload.
[DEBUG] com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.debug:57 - Entering nullPropertyValue [target=[com.opensymphony.xwork2.DefaultTextProvider@29e03842], property=struts]
[WARN ] com.opensymphony.xwork2.ognl.OgnlValueStack.warn:45 - Could not find property [struts.actionMapping]
[DEBUG] com.opensymphony.xwork2.config.ConfigurationManager.debug:57 - Checking ConfigurationProviders for reload.
[DEBUG] com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.debug:57 - Entering nullPropertyValue [target=[com.opensymphony.xwork2.DefaultTextProvider@29e03842], property=struts]
[WARN ] com.opensymphony.xwork2.ognl.OgnlValueStack.warn:45 - Could not find property [struts.valueStack]
[DEBUG] com.opensymphony.xwork2.config.ConfigurationManager.debug:57 - Checking ConfigurationProviders for reload.
[DEBUG] com.opensymphony.xwork2.DefaultActionProxy.debug:57 - Creating an DefaultActionProxy for namespace / and action name crud
[DEBUG] com.opensymphony.xwork2.interceptor.PrefixMethodInvocationUtil.debug:57 - cannot find method [prepareSave] in action [com.aurifa.struts2.tutorial.action.EmployeeAction@4e8659a]
[DEBUG] com.opensymphony.xwork2.interceptor.PrefixMethodInvocationUtil.debug:57 - cannot find method [prepareDoSave] in action [com.aurifa.struts2.tutorial.action.EmployeeAction@4e8659a]
****** REOPENING SESSION ******
Hibernate: select department0_.departmentId as departme1_1_, department0_.name as name1_ from test2.Department department0_
****** REOPENING SESSION ******
Hibernate: select employee0_.employeeId as employeeId0_1_, employee0_.age as age0_1_, employee0_.departmentId as departme5_0_1_, employee0_.firstName as firstName0_1_, employee0_.lastName as lastName0_1_, department1_.departmentId as departme1_1_0_, department1_.name as name1_0_ from test2.Employee employee0_ left outer join test2.Department department1_ on employee0_.departmentId=department1_.departmentId where employee0_.employeeId=?
[DEBUG] com.opensymphony.xwork2.interceptor.I18nInterceptor.debug:57 - intercept '//crud' { 
[DEBUG] com.opensymphony.xwork2.interceptor.I18nInterceptor.debug:57 - before Locale=en_US
[DEBUG] com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.debug:57 - Entering nullPropertyValue [target=[com.aurifa.struts2.tutorial.action.EmployeeAction@4e8659a, com.opensymphony.xwork2.DefaultTextProvider@29e03842], property=struts]
[WARN ] com.opensymphony.xwork2.ognl.OgnlValueStack.warn:45 - Could not find property [struts]
[DEBUG] org.apache.struts2.interceptor.FileUploadInterceptor.debug:57 - Bypassing //crud
[DEBUG] com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.debug:57 - Setting static parameters {}
[DEBUG] com.opensymphony.xwork2.interceptor.ParametersInterceptor.debug:57 - Setting params employee.age => [ 4 ] employee.department.departmentId => [ 1 ] employee.employeeId => [ 9 ] employee.firstName => [ dsadsa ] employee.lastName => [ dsads ] 
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Property: age
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Class: com.aurifa.struts2.tutorial.model.Employee
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - field-level type converter for property [age] = none found
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Property: employee.age
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Class: com.aurifa.struts2.tutorial.action.EmployeeAction
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - global-level type converter for property [age] = none found
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@62f3782]
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Property: departmentId
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Class: com.aurifa.struts2.tutorial.model.Department
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - field-level type converter for property [departmentId] = none found
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Property: employee.department.departmentId
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Class: com.aurifa.struts2.tutorial.model.Employee
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - global-level type converter for property [departmentId] = none found
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@62f3782]
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Property: employeeId
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Class: com.aurifa.struts2.tutorial.model.Employee
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - field-level type converter for property [employeeId] = none found
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Property: employee.employeeId
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Class: com.aurifa.struts2.tutorial.action.EmployeeAction
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - global-level type converter for property [employeeId] = none found
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@62f3782]
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Property: firstName
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Class: com.aurifa.struts2.tutorial.model.Employee
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - field-level type converter for property [firstName] = none found
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Property: employee.firstName
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Class: com.aurifa.struts2.tutorial.action.EmployeeAction
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - global-level type converter for property [firstName] = none found
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@62f3782]
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Property: lastName
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Class: com.aurifa.struts2.tutorial.model.Employee
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - field-level type converter for property [lastName] = none found
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Property: employee.lastName
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - Class: com.aurifa.struts2.tutorial.action.EmployeeAction
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - global-level type converter for property [lastName] = none found
[DEBUG] com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:57 - falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@62f3782]
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.intercept:151 - Preparing Injection Hibernate Session and Transaction process: /crud - Method: com.aurifa.struts2.tutorial.action.EmployeeAction.save()
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getSession:91 - Hibernate Session Required (from current Thread) - SessionFactory required: (default)
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getSession:98 - No Hibernate Session in current thread. New Hibernate Session will be created and returned (SessionFactory "(default)")
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getNewSession:153 - New Hibernate Session required - SessionFactory required: (default)
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getNewSession:167 - New Hibernate Session created and returned (SessionFactory "")
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.getHibernateSessionFromFactory:380 - Hibernate Session from Full Hibernate Plugin's Hibernate Session Factory
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.debugInfoSessionInjectedByAnnotation:508 - Hibernate Session injected (by annotation) into Action. Field "session". Class "com.rwblackburn.struts2.tutorial.dao.EmployeeHibernateDao"
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getSession:91 - Hibernate Session Required (from current Thread) - SessionFactory required: (default)
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getSession:125 - Existing Hibernate Session from current thread returned (SessionFactory "")
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.getHibernateSessionFromFactory:380 - Hibernate Session from Full Hibernate Plugin's Hibernate Session Factory
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.debugInfoSessionInjectedByAnnotation:508 - Hibernate Session injected (by annotation) into Action. Field "session". Class "com.rwblackburn.struts2.tutorial.dao.DepartmentHibernateDao"
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.debugInfoTransactionInjectedByAnnotation:599 - Hibernate Transaction injected (by annotation) into Action. Field "transaction". Class "com.rwblackburn.struts2.tutorial.dao.EmployeeHibernateDao"
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.debugInfoTransactionInjectedByAnnotation:599 - Hibernate Transaction injected (by annotation) into Action. Field "transaction". Class "com.rwblackburn.struts2.tutorial.dao.DepartmentHibernateDao"
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.intercept:77 - Full     Hibernate Plugin Validation in class com.aurifa.struts2.tutorial.action.EmployeeAction
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.intercept:116 - Full Hibernate Plugin Validation found no erros.
[DEBUG] com.opensymphony.xwork2.DefaultActionInvocation.debug:57 - Executing action method = input
[DEBUG] org.apache.struts2.dispatcher.ServletRedirectResult.debug:57 - Redirecting to finalLocation /test2/index.action
Hibernate: update test2.Employee set age=?, departmentId=?, firstName=?, lastName=? where employeeId=?
[DEBUG] com.opensymphony.xwork2.config.ConfigurationManager.debug:57 - Checking ConfigurationProviders for reload.
[DEBUG] com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.debug:57 - Entering nullPropertyValue [target=[com.opensymphony.xwork2.DefaultTextProvider@29e03842], property=struts]
[WARN ] com.opensymphony.xwork2.ognl.OgnlValueStack.warn:45 - Could not find property [struts.actionMapping]
[DEBUG] com.opensymphony.xwork2.config.ConfigurationManager.debug:57 - Checking ConfigurationProviders for reload.
[DEBUG] com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.debug:57 - Entering nullPropertyValue [target=[com.opensymphony.xwork2.DefaultTextProvider@29e03842], property=struts]
[WARN ] com.opensymphony.xwork2.ognl.OgnlValueStack.warn:45 - Could not find property [struts.valueStack]
[DEBUG] com.opensymphony.xwork2.config.ConfigurationManager.debug:57 - Checking ConfigurationProviders for reload.
[DEBUG] com.opensymphony.xwork2.DefaultActionProxy.debug:57 - Creating an DefaultActionProxy for namespace / and action name index
[DEBUG] com.opensymphony.xwork2.interceptor.PrefixMethodInvocationUtil.debug:57 - cannot find method [prepareList] in action [com.aurifa.struts2.tutorial.action.EmployeeAction@7a23792b]
[DEBUG] com.opensymphony.xwork2.interceptor.PrefixMethodInvocationUtil.debug:57 - cannot find method [prepareDoList] in action [com.aurifa.struts2.tutorial.action.EmployeeAction@7a23792b]
Hibernate: select department0_.departmentId as departme1_1_, department0_.name as name1_ from test2.Department department0_
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.commitHibernateTransaction:264 - Hibernate Transation  org.hibernate.transaction.JDBCTransaction@54ebb9ba rolledback by Full Hibernate Plugin
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.closeSession:207 - Hibernate Session closed
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.closeHibernateSession:275 - Hibernate Session closed by Full Hibernate Plugin's Hibernate Session Factory
[DEBUG] com.opensymphony.xwork2.config.ConfigurationManager.debug:57 - Checking ConfigurationProviders for reload.
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.intercept:219 - Hibernate Transaction Committed
[DEBUG] com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.intercept:238 - Injection Hibernate Session and Transaction process for /crud - Method: com.aurifa.struts2.tutorial.action.EmployeeAction.save() finished
[DEBUG] com.opensymphony.xwork2.interceptor.I18nInterceptor.debug:57 - after Locale=en_US
[DEBUG] com.opensymphony.xwork2.interceptor.I18nInterceptor.debug:57 - intercept } 

Я, вероятно, просто пропускаю вышеупомянутую проверку сеанса в одномиз моих методов, который использует сессию.Однако на данный момент кажется, что это не может быть ответом, и я либо делаю что-то очень неправильно, либо что-то отсутствует.

Я могу отправить кому-нибудь файл WAR этого тестового приложения по электронной почте (используя Struts2.1.6) если они нужны.Любая помощь будет оценена.

Спасибо

PS: Сначала я опубликовал это на форуме поддержки плагинов, но не получил ответа, поэтому надеялся, что SO сможет мне помочь (isseu # 36 по коду.google.com / p / full-hibernate-plugin-for-struts2 / Issues)

1 Ответ

0 голосов
/ 25 июня 2013

Похоже, вы застряли на ленивой концепции загрузки. Почему вы не оставляете сеанс открытым до тех пор, пока не загрузите все свои объекты от сущностей или не загрузите все элементы с нетерпением.

...