2

我有一个项目,我同时使用 Hibernate 和 Struts2,而且我对它们都是新手。

我在使用 Hibernate 和 Struts2 组合解决 CRUD 过程时遇到了麻烦。我想以特定方式执行此操作,但遇到了麻烦。为了复制我在主项目之外遇到的问题,我从本教程下载了 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)创建com.rwblackburn.struts2.tutorial.dao.InitHibernate,并执行它以创建初始数据库并使用与演示相同的数据填充它:

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) 创建了实现 EmployeeDao 的 com.rwblackburn.struts2.tutorial.dao.EmployeeHibernateDao

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) 创建了实现 DepartmentDao 的 com.rwblackburn.struts2.tutorial.dao.DepartmentHibernateDao

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)

当我进行调试跟踪时,我可以确认 DepartmentHibernateDao 中的 Session 和 Transaction 变量实际上为空。

经过大量搜索后,我发现了这个线程: Struts2 + Full Hibernate Plugin --> Session is Closed?

这似乎与我遇到的问题相同。但是,即使我将 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:会话已关闭!” 基于上述线程。

这让我通过了“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 文件(使用 Struts 2.1.6)。任何帮助将不胜感激。

谢谢你

PS:我确实首先在插件支持论坛上发布了这个,但没有得到回应,所以希望 SO 能够帮助我(code.google.com/p/full-hibernate-plugin-for 上的 iseu #36 -struts2/问题)

4

1 回答 1

0

好像你被困在延迟加载的概念上。为什么不让会话保持打开状态,直到从实体加载所有项目或急切加载所有项目。

于 2013-06-25T11:47:47.097 回答