问题原型:项目中的一个小的留言板程序,大致是这样得:用户发表留言后,保存留言后并返回到留言展示页面,即用户留言与留言展示共享同一个视图页面。程序处理流程如下:
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 3.2.2 Hibernate 3.3.2 Struts 2.3.4 用JPA的注解实现orm 不用创建数据库表 只需本机上有oracle即可 用JSR注解进行Spring的...用Spring Test整合Junit4 进行测试并自动事务回滚 不对数据库造成持久化操作
Maven框架项目该项目不再更新维护,请移步该项目基于maven3.0构建的,项目中融合了Struts1 , Struts2 , Spring , SpringMVC , Hibernate , Ibatis , MyBatis , Spring Data JPA , Spring JDBC , Spring DWR...
国内知名的高端IT技术作家,已出版《Spring 2.0宝典》、《基于J2EE的Ajax宝典》、《轻量级J2EE企业应用实战》、《Struts 2权威指南》、《Ruby On Rails敏捷开发最佳实践》等著作。 目录: 第0章 学习Java...
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...
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...
处理多个持久化单元 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框架的集成 ...
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...
第26章 权限管理系统(struts 2.x+spring+jpa) 26.1 权限管理系统简述 26.2 权限管理系统前期准备 26.3 权限管理系统具体实现——关联表操作 26.4 权限管理系统具体实现——模块操作 26.5 权限管理...
2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个...
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 ...
①ORM 与持久化映射 ②延迟加载、 性能优化 ③HQL 查询、 条件查询、 SQL 查询 ④二级缓存与查询缓存 3、 Struts ①MVC 模式与 Struts 体系 4、 mybatis 5、 MVC 框架 6、 各框架对比与项目优化 7、 JPA ①EJB 三、 ...
Spring是当今最主流的服务层框架,它的使用实现了应用程序的n层结构,最大程度的降低了各模块之间的耦合,提高了应用程序的开发效率和可维护性,选用的Struts2作为系统的表示层框架,在数据持久层方面则使用了...
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 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...
第五章 Advanced Persistence Concepts(JPA-高级持久化)..336 第六章 事务...........341 Spring学习笔记...............345 第一章 Spring概述..........................345 第二章 Spring IOC(控制反转)...........
第五章 Advanced Persistence Concepts(JPA-高级持久化)..336 第六章 事务...........341 Spring学习笔记...............345 第一章 Spring概述..........................345 第二章 Spring IOC(控制反转)...........