`
86asm
  • 浏览: 199542 次
  • 性别: 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管理的对象在使用时,一定要根据具体的需要来灵活设置作用域。

分享到:
评论

相关推荐

    带事务回滚测试的SSH整合小案例(Spring 3.2+Hibernate 3.3+Struts 2.3)

    集成了Spring 3.2.2 Hibernate 3.3.2 Struts 2.3.4 用JPA的注解实现orm 不用创建数据库表 只需本机上有oracle即可 用JSR注解进行Spring的...用Spring Test整合Junit4 进行测试并自动事务回滚 不对数据库造成持久化操作

    maven-framework-project:基于maven的多框架和多视图融合技术(Struts1,Struts2,Spring,SpringMVC,Hibernate,Ibatis,MyBatis,Spring Data JPA,DWR)

    Maven框架项目该项目不再更新维护,请移步该项目基于maven3.0构建的,项目中融合了Struts1 , Struts2 , Spring , SpringMVC , Hibernate , Ibatis , MyBatis , Spring Data JPA , Spring JDBC , Spring DWR...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

     国内知名的高端IT技术作家,已出版《Spring 2.0宝典》、《基于J2EE的Ajax宝典》、《轻量级J2EE企业应用实战》、《Struts 2权威指南》、《Ruby On Rails敏捷开发最佳实践》等著作。 目录: 第0章 学习Java...

    Spring in Action(第二版 中文高清版).part2

    16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring...

    Spring in Action(第2版)中文版

    16.2协同使用spring和webwork2/struts2 16.3集成spring和tapestry 16.3.1集成spring和tapestry3 16.3.2集成spring和tapestry4 16.4协同使用spring和jsf 16.4.1解析jsf管理的属性 16.4.2解析springbean 16.4.3...

    Spring-Reference_zh_CN(Spring中文参考手册)

    处理多个持久化单元 12.6.2. JpaTemplate 和 JpaDaoSupport 12.6.3. 基于原生的JPA实现DAO 12.6.4. 异常转化 12.6.5. 事务管理 12.6.6. JpaDialect III. Web 13. Web框架 13.1. 介绍 13.1.1. 与其他web框架的集成 ...

    Spring in Action(第二版 中文高清版).part1

    16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring...

    JAVA WEB典型模块与项目实战大全

    第26章 权限管理系统(struts 2.x+spring+jpa)  26.1 权限管理系统简述  26.2 权限管理系统前期准备  26.3 权限管理系统具体实现——关联表操作  26.4 权限管理系统具体实现——模块操作  26.5 权限管理...

    Spring面试题

    2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个...

    JAVA程序开发大全---上半部分

    9.2.6 使用反向工程生成持久化对象、映射文件和DAO类 143 9.2.7 使用Hibernate功能 151 9.3 MyEclipse中Hibernate框架的高级操作 152 9.3.1 在Hibernate反向工程中定制映射关系 153 9.3.2 使用HQL编辑器 154 9.4 ...

    java面试题库2021.pdf

    ①ORM 与持久化映射 ②延迟加载、 性能优化 ③HQL 查询、 条件查询、 SQL 查询 ④二级缓存与查询缓存 3、 Struts ①MVC 模式与 Struts 体系 4、 mybatis 5、 MVC 框架 6、 各框架对比与项目优化 7、 JPA ①EJB 三、 ...

    基于SSH架构的人力资源管理系统

    Spring是当今最主流的服务层框架,它的使用实现了应用程序的n层结构,最大程度的降低了各模块之间的耦合,提高了应用程序的开发效率和可维护性,选用的Struts2作为系统的表示层框架,在数据持久层方面则使用了...

    J2EE应用开发详解

    294 16.3.5 数据库连接池中使用JDBC 297 16.4 小结 302 第17章 ORM与Java持久化机制 303 17.1 ORM概述 303 17.2 域模型 304 17.3 实体域对象的持久化模式 304 17.4 JPA 305 17.4.1 实体 306 17.4.2 EntityManager ...

    Java常见面试题208道.docx

    面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...

    J2EE学习笔记(J2ee初学者必备手册)

    第五章 Advanced Persistence Concepts(JPA-高级持久化)..336 第六章 事务...........341 Spring学习笔记...............345 第一章 Spring概述..........................345 第二章 Spring IOC(控制反转)...........

    Java/JavaEE 学习笔记

    第五章 Advanced Persistence Concepts(JPA-高级持久化)..336 第六章 事务...........341 Spring学习笔记...............345 第一章 Spring概述..........................345 第二章 Spring IOC(控制反转)...........

Global site tag (gtag.js) - Google Analytics