我有一个项目,我一起使用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&amp;带有持久性注释的com.aurifa.struts2.tutorial.model.Employee。
4)创建了com.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)创建了实现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&amp; DepartmentDaoService使用新的hibernate DAO而不是演示中的“NoDB”版本
现在,InitHibernate运行得很好,所以我知道至少有很多工作,而DB本身也没问题。但是,当我尝试在浏览器中加载项目时,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变量实际上是null。
经过大量的搜索后,我找到了这个帖子: 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
此外,我通过在某些hibernate会话调用之前添加“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被关闭!”基于上面的线程。
这让我传递了“java.lang.NullPointerException”和“org.hibernate.SessionException:Session被关闭了!”有些时候但这是不一致的,如果我不断刷新页面它最终会回来。
以下是此新问题的堆栈跟踪(您可以通过上述方法查看我的一些打印行):
[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:我之前在Plug-in支持论坛上发布了这个,但没有得到任何回复,所以希望SO能够帮助我(isseu#36 on code.google.com/p/full-hibernate- plugin-for-struts2 / issues)答案 0 :(得分:0)
好像你被困在了懒惰的装载概念上。为什么不将会话保持打开状态,直到您从实体加载所有项目或者急切加载所有项目为止。