问题原型:项目中的一个小的留言板程序,大致是这样得:用户发表留言后,保存留言后并返回到留言展示页面,即用户留言与留言展示共享同一个视图页面。程序处理流程如下:
1.用户提交留言
2.struts2接受数据,并调用业务逻辑层保存数据,返回到留言展示页面
3.留言展示页面是由另一个action负责,用户添加留言与展示页面是同一个struts action类。它们的代码如下:
package com.asm.bbs.action;
//省略导入的包
/**
* 前台留言板的添加展示
*
* @author heou0709@126.com
*
*/
@Controller
public class SimpleMessageAction extends ActionSupport implements ServletRequestAware {
private static final long serialVersionUID = 1L;
@Resource
private SimpleMessageService messageService;
private HttpServletRequest request;
private Integer page = 1;
private SimpleMessage message;
/**
* 留言展示页面
*/
public String listMsg() throws Exception {
//业务逻辑处理,准备分页数据给展示页面
return "success";
}
/**
* 添加留言
*/
public String addMsg() throws Exception {
//调用业务逻辑层,持久化留言数据
return "success";
}
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public SimpleMessage getMessage() {
return message;
}
public void setMessage(SimpleMessage message) {
this.message = message;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}
需要说明的是,当添加留言并处理后,经过redirectAction方式跳转到留言展示页面。在struts的配置如下:
<action name="goWord" class="simpleMessageAction" method="listMsg">
<result>/WEB-INF/..../leverWord.jsp</result>
</action>
<action name="addWord" class="simpleMessageAction" method="addMsg">
<result name="success" type="redirectAction">
<param name="actionName">goWord</param>
</result>
</action>
由于做了这样的配置,每次第一次添加留言都没的问题,但是如果第二次添加就会出问题,出现的异常如下:
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.asm.xxxx.SimpleMessage
org.hibernate.PersistentObjectException: detached entity passed to persist: com.asm.xxxx.SimpleMessage
报这个错误的原因:struts2的强大的数据还原功能:因为第二次添加留言时,SimpleMessage类已具有一个初始化的id数据,这时我想起在hibernate官方文档说如果id是自动生成的,建议一定要把它的setter方式设为私有,如果在这里真这样做,问题仍不能解决,因为struts填充数据,并不只是依赖于字段的setter方式,它会借助于强大的反射功能和值栈技术,所以struts2的数据保存还原非常强大。要解决此问题的一个有效方式是对此action加spring实例对象作用域注解,因为受spring管理的所有类,默认的作用域singleton,即共享同一个bean实例对象。 在此处加上prototype注解:
每次请求都会创建一个实例,这样处理后问题基本解决,如果更合理的作用域,应根据具体需求来选择spring的web作用域。
总结:1.org.hibernate.PersistentObjectException: detached entity passed to
persist异常原因:本该是自动生成id值被手工赋值,实体与数据库表的设计不相符
2.struts2的数据填充不只是依赖于setter方式,它会借助于反射实现数据填充。
3.spring管理的对象在使用时,一定要根据具体的需要来灵活设置作用域。
分享到:
相关推荐
标题 "Spring+Hibernate+Jpa+Struts2整合实例" 描述的是一个综合性的Web开发教程,它将四个关键的Java技术框架集成在一起,用于构建高效的企业级应用程序。这个实例涵盖了Spring作为整体应用的管理框架,Hibernate...
标题提到的“s2sh s2sh项目 JPA项目 JPA+struts2+Hibernate+spring”是指一个基于Struts2、Spring和Hibernate的Java Web项目,其中还集成了JPA(Java Persistence API)作为数据持久化层。这个项目是一个很好的学习...
总结,JPA、Struts1和Spring的整合是Java Web开发中的经典组合,它通过各框架的协同工作,实现了业务逻辑、数据持久化和Web交互的高效管理。尽管现代开发中,这些技术可能已被更新的框架取代,但了解它们的原理和...
**标题:“JPA+Spring+Struts2整合”** 在Java Web开发中,Spring、Struts2和JPA(Java Persistence API)是三个非常重要的框架。它们分别负责不同的职责:Spring作为全面的轻量级应用框架,Struts2是MVC(Model-...
整合Spring、JPA和Struts1可以带来很多优势,如更灵活的架构、强大的持久化能力以及良好的MVC设计模式。然而,要注意的是,Struts1相对较旧,现在更多的项目倾向于使用Struts2或Spring MVC。理解这些框架的基本原理...
Struts2处理用户请求和视图跳转,Spring提供依赖管理和事务控制,而JPA则负责数据持久化。这种整合方式大大简化了开发流程,提高了代码的可维护性和可扩展性。在实际项目中,开发者应熟练掌握这些框架的使用和整合...
**Spring+Struts2+JPA 整合详解** 在Java Web开发中,Spring、Struts2和JPA是三个非常重要的框架。Spring作为一个全面的轻量级框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能;Struts2是一个强大的MVC框架...
**JPA+Spring+Struts整合实例** 在Java企业级应用开发中,Spring、Struts和JPA(Java Persistence API)是三个非常重要的框架。它们分别负责不同的职责:Spring作为一个全能型框架,提供了依赖注入(DI)和面向切面...
### Spring+JPA+Struts2 整合详解 #### 一、概述 在现代Java Web开发中,采用多种框架进行整合是常见的实践方法之一。本文将详细介绍如何使用Spring、JPA与Struts2这三个框架进行整合,并通过具体的示例代码来解释...
Struts2整合Spring和JPA是企业级Java应用开发中常见的技术组合,它们分别负责不同的职责:Struts2作为一款成熟的MVC框架,主要用于处理Web层的请求与响应;Spring作为一个全面的轻量级框架,提供了依赖注入(DI)和...
**JPA+Spring2.5+Struts2.0整合详解** 在Java开发领域,Spring、Struts和JPA(Java Persistence API)是常见的三大框架,它们分别在依赖注入、MVC架构和对象关系映射方面发挥着重要作用。本实例将深入讲解如何将这...
在本案例中,"2014年2月16最新struts+JPA+spring整合jar包" 提供了这些技术的集成解决方案,用于构建一个基于JPA的SSH应用。 首先,让我们深入理解SSH框架的核心功能: 1. **Struts**:这是一个MVC(Model-View-...
SSH是Java开发中的一种经典企业级应用框架组合,由Spring、Hibernate和Struts2组成,分别负责控制层、持久层和表现层。Spring是整个应用的核心,提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,极大地简化了...
总体来说,"struts2+spring2+jpa+ajax"的组合展现了Java Web开发的强大能力,涵盖了从前端到后端、从数据持久化到用户体验的完整流程。这种架构允许开发者专注于业务逻辑,而不必过于关注底层技术细节,提高了开发...
`Struts 2 + Spring 2 + JPA + AJAX.mht` 文件可能是项目的演示文档或教程,包含了关于如何整合这些技术的详细步骤和示例。而 `复件 quickstart` 可能是快速启动项目的目录,包含了一些预配置的文件和示例代码,帮助...