`
86asm
  • 浏览: 203764 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JPA+struts2+spring整合持久化的问题

阅读更多

      问题原型:项目中的一个小的留言板程序,大致是这样得:用户发表留言后,保存留言后并返回到留言展示页面,即用户留言与留言展示共享同一个视图页面。程序处理流程如下:

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整合实例

    标题 "Spring+Hibernate+Jpa+Struts2整合实例" 描述的是一个综合性的Web开发教程,它将四个关键的Java技术框架集成在一起,用于构建高效的企业级应用程序。这个实例涵盖了Spring作为整体应用的管理框架,Hibernate...

    s2sh s2sh项目 JPA项目 JPA+struts2+Hibernate+spring

    标题提到的“s2sh s2sh项目 JPA项目 JPA+struts2+Hibernate+spring”是指一个基于Struts2、Spring和Hibernate的Java Web项目,其中还集成了JPA(Java Persistence API)作为数据持久化层。这个项目是一个很好的学习...

    jpa+struts1+spring整合jar包(43个)

    总结,JPA、Struts1和Spring的整合是Java Web开发中的经典组合,它通过各框架的协同工作,实现了业务逻辑、数据持久化和Web交互的高效管理。尽管现代开发中,这些技术可能已被更新的框架取代,但了解它们的原理和...

    JPA+Spring+Struts2整合

    **标题:“JPA+Spring+Struts2整合”** 在Java Web开发中,Spring、Struts2和JPA(Java Persistence API)是三个非常重要的框架。它们分别负责不同的职责:Spring作为全面的轻量级应用框架,Struts2是MVC(Model-...

    Spring+JPA+Struts1的整合

    整合Spring、JPA和Struts1可以带来很多优势,如更灵活的架构、强大的持久化能力以及良好的MVC设计模式。然而,要注意的是,Struts1相对较旧,现在更多的项目倾向于使用Struts2或Spring MVC。理解这些框架的基本原理...

    Struts2+JPA+Spring整合(PPT)

    Struts2处理用户请求和视图跳转,Spring提供依赖管理和事务控制,而JPA则负责数据持久化。这种整合方式大大简化了开发流程,提高了代码的可维护性和可扩展性。在实际项目中,开发者应熟练掌握这些框架的使用和整合...

    Spring+Struts2+JPA

    **Spring+Struts2+JPA 整合详解** 在Java Web开发中,Spring、Struts2和JPA是三个非常重要的框架。Spring作为一个全面的轻量级框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能;Struts2是一个强大的MVC框架...

    JPA+Spring+Struts整合实例

    **JPA+Spring+Struts整合实例** 在Java企业级应用开发中,Spring、Struts和JPA(Java Persistence API)是三个非常重要的框架。它们分别负责不同的职责:Spring作为一个全能型框架,提供了依赖注入(DI)和面向切面...

    Spring+JPA+Struts2

    ### Spring+JPA+Struts2 整合详解 #### 一、概述 在现代Java Web开发中,采用多种框架进行整合是常见的实践方法之一。本文将详细介绍如何使用Spring、JPA与Struts2这三个框架进行整合,并通过具体的示例代码来解释...

    Struts2整合Spring、JPA

    Struts2整合Spring和JPA是企业级Java应用开发中常见的技术组合,它们分别负责不同的职责:Struts2作为一款成熟的MVC框架,主要用于处理Web层的请求与响应;Spring作为一个全面的轻量级框架,提供了依赖注入(DI)和...

    JPA+Spring2.5+Struts2.0实例 附详细文档

    **JPA+Spring2.5+Struts2.0整合详解** 在Java开发领域,Spring、Struts和JPA(Java Persistence API)是常见的三大框架,它们分别在依赖注入、MVC架构和对象关系映射方面发挥着重要作用。本实例将深入讲解如何将这...

    2014年2月16最新struts+JPA+spring整合jar包

    在本案例中,"2014年2月16最新struts+JPA+spring整合jar包" 提供了这些技术的集成解决方案,用于构建一个基于JPA的SSH应用。 首先,让我们深入理解SSH框架的核心功能: 1. **Struts**:这是一个MVC(Model-View-...

    spring4+hiberante4+struts2+maven

    SSH是Java开发中的一种经典企业级应用框架组合,由Spring、Hibernate和Struts2组成,分别负责控制层、持久层和表现层。Spring是整个应用的核心,提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,极大地简化了...

    struts2+spring2+jpa+ajax

    总体来说,"struts2+spring2+jpa+ajax"的组合展现了Java Web开发的强大能力,涵盖了从前端到后端、从数据持久化到用户体验的完整流程。这种架构允许开发者专注于业务逻辑,而不必过于关注底层技术细节,提高了开发...

    Struts 2 + Spring 2 + JPA + AJAX

    `Struts 2 + Spring 2 + JPA + AJAX.mht` 文件可能是项目的演示文档或教程,包含了关于如何整合这些技术的详细步骤和示例。而 `复件 quickstart` 可能是快速启动项目的目录,包含了一些预配置的文件和示例代码,帮助...

Global site tag (gtag.js) - Google Analytics