SSH框架,action的scope设置为prototype一个奇怪问题,求解

问题描述

我用SSH框架做权限管理时遇到一个奇怪问题:用户表:T_USER角色表:T_ROLE菜单表:T_RESOURCE角色用户表:T_USER_ROLE角色资源表:T_ROLE_RESOURCE我在修改角色时,如果Struts2的action设置为@Scope("prototype")时,会删除角色用户表和角色资源表数据:Hibernate:updateT_ROLEsetUPDATE_DATE=?whereID=?Hibernate:deletefromT_ROLE_RESOURCEwhereROLE_ID=?Hibernate:deletefromT_USER_ROLEwhereROLE_ID=?如果去掉@Scope("prototype"),更新正常:Hibernate:updateT_ROLEsetUPDATE_DATE=?whereID=?角色表POJO如下:@Entity@org.hibernate.annotations.Entity(selectBeforeUpdate=true,dynamicInsert=true,dynamicUpdate=true)@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)@Table(name="T_ROLE")publicclassRoleextendsAuditModelimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValue(strategy=GenerationType.AUTO)@Column(name="ID",nullable=false)privateLongid;@Column(name="NAME_ZH",length=64,nullable=false)privateStringnameZh;@Column(name="NAME_EN",length=64,nullable=false)privateStringnameEn;@Column(name="ROLE_CODE",length=30,nullable=false)privateStringroleCode;@Column(name="DESCRIPTION",length=64)privateStringdescription;@ManyToMany(cascade={CascadeType.MERGE},fetch=FetchType.LAZY)@JoinTable(name="T_ROLE_RESOURCE",joinColumns={@JoinColumn(name="ROLE_ID")},inverseJoinColumns={@JoinColumn(name="RESOURCE_ID")})privateSet<Resource>tsResources;@ManyToMany(cascade={CascadeType.MERGE},fetch=FetchType.LAZY)@JoinTable(name="T_USER_ROLE",joinColumns={@JoinColumn(name="ROLE_ID")},inverseJoinColumns={@JoinColumn(name="USER_ID")})privateSet<User>tsUsers=newHashSet<User>(0);@TransientprivateBooleanischecked=false;publicRole(){}publicLonggetId(){returnthis.id;}publicStringgetNameZh(){returnnameZh;}publicvoidsetNameZh(StringnameZh){this.nameZh=nameZh;}publicStringgetNameEn(){returnnameEn;}publicvoidsetNameEn(StringnameEn){this.nameEn=nameEn;}publicStringgetRoleCode(){returnroleCode;}publicvoidsetRoleCode(StringroleCode){this.roleCode=roleCode;}publicStringgetDescription(){returnthis.description;}publicSet<Resource>getTsResources(){returnthis.tsResources;}publicvoidsetTsResources(Set<Resource>tsResources){this.tsResources=tsResources;}publicSet<User>getTsUsers(){returnthis.tsUsers;}publicvoidsetDescription(Stringdescription){this.description=description;}publicvoidsetId(Longid){this.id=id;}publicvoidsetTsUsers(Set<User>tsUsers){this.tsUsers=tsUsers;}publicBooleangetIschecked(){returnischecked;}publicvoidsetIschecked(Booleanischecked){this.ischecked=ischecked;}}

解决方案

解决方案二:
这个问题很奇怪,没有发现过这个问题,可能需要看源码.区别应该是这样:(1)scope="prototype"(多态)是在每次用户发起请求时重新生成action对象,对于多线程访问不会出现问题,如果没有配置scope=prototype则添加的时候不会新建一个action,他任然会保留上次访问的过记录的信息。(2)默认是scope="singleton"(单态),这些bean被spring初始化后,始终只有一份,很适用于无状态的bean,DAO、Service都采用的这种。当然,scope的值还有session,request等等。(3)希望解决以后附上原因,解决过程中是可以学到很多知识的,特别是看过源码之后就会了解.
解决方案三:
你修改的时候是不是直接用的update()方法?
解决方案四:
使用merge方法试一试
解决方案五:
是调用的update方法:@Overridepublic<T>Tupdate(Tt){returnbaseDao.update(t);}
解决方案六:
经过测试使用merge方法可以的,但是什么原因呢,据我所知,merge是hibernate又new的了对象,把要更新的对象拷贝到new的对象里面,执行完成后new的对象是持久状态,而之前的对象还是托管状态。
解决方案七:
不好意思,merge也不行,我刚才测试时是因为把,角色用户表:T_USER_ROLE,角色资源表:T_ROLE_RESOURCE两张表数据删除了,没有出现删除语句。

时间: 2024-09-18 18:26:55

SSH框架,action的scope设置为prototype一个奇怪问题,求解的相关文章

用strut2集成SSH框架Action中调用Dao层方法出现空指针异常

问题描述 自己弄了spring的配置文件,和strut的配置文件这个是服务层的代码publicclassSerservicesimplementsISerservices{privateICstServiceDAOServicedao;publicvoidsetDao(ICstServiceDAOServicedao){this.dao=dao;}publicvoidsave(CstServicebean){dao.save(bean);}}这个是Action的代码publicclassSerA

SSH框架网上商城项目第2战之基本增删查改、Service和Action的抽取_java

上一节<SSH框架网上商城项目第1战之整合Struts2.Hibernate4.3和Spring4.2>我们搭建好了Struts2.Hibernate和Spring的开发环境,并成功将它们整合在一起.这节主要完成一些基本的增删改查以及Service.Dao和Action的抽取.1. Service层的抽取        上一节中,我们在service层简单写了save和update方法,这里我们开始完善该部分的代码,然后对service层的代码进行抽取.1.1 完善CategoryServic

求问ssh框架中jsp页面传给action指定方法,action无法自动获取

问题描述 求问ssh框架中jsp页面传给action指定方法,action无法自动获取,jsp中name也指定了,action无法get到textfiled传进去的值 解决方案 解决方案二:是struts2吗?具体贴代码把,如果textfiled设置成disabled也是不传值得解决方案三:引用1楼ltyisangel的回复: 是struts2吗?具体贴代码把,如果textfiled设置成disabled也是不传值得 readonly是可以传值的解决方案四:你在方法里面request.getPa

过滤器怎么调用action-自定义的过滤器怎么调用ssh框架下的action业务层

问题描述 自定义的过滤器怎么调用ssh框架下的action业务层 我自定义的过滤器怎么调用javaWeb三大框架下的action业务层,我想讲我过滤器得到的用户ip等信息写入数据库 解决方案 首先,过滤器是请求到达Action之前被调用的,而且对所有的符合url-pattern的请求都会调用. 其次,没必要在过滤器中调用Action的业务,因为如果过滤操作执行完成后,最后action是会被执行的. 最后,你希望过滤得到用户的ip等信息,但是是否所有的请求都有ip信息呢?还是只有特定的action

java框架-使用ssh框架从jsp页面提交时,在action中的save方法报空指针错误

问题描述 使用ssh框架从jsp页面提交时,在action中的save方法报空指针错误 解决方案 断点看下表单值有没有传到action 解决方案二: 在线等,求大神 解决方案三: 先检查一下你的user对象有没有值 解决方案四: 这种问题一般都是设断点跟踪一下看看是哪里的问题 解决方案五: 这种问题一般都是设断点跟踪一下看看是哪里的问题 解决方案六: 如果user不为空的话,,,那应该是userInfoBizImpl为空

java-刚学ssh框架做了一个项目 jsp页面无法获取action的值,求教啊。。。以下是代码

问题描述 刚学ssh框架做了一个项目 jsp页面无法获取action的值,求教啊...以下是代码 页面都正常跳转 就是取不到值 用的是iframe框架 main.jsp可以获取,不过main.jsp指向的top.jsp页面无法获取值 Action部分代码 private static final long serialVersionUID = 1L; private UserService userService; private User user; public String login()

ssh框架的。。购物车用数据库dao层,service层,和action层怎么写啊

问题描述 ssh框架的..购物车用数据库dao层,service层,和action层怎么写啊 求大神给指点一下!!!!!!!!!!!!!!!!!!谢谢了!!!!!!!!!!!!!!!!!! 解决方案 dao层和service层Android中的分层----service 层domain层,dao 层,action层等设计Action层 Service层 ,modle层 和 Dao层的作用? 解决方案二: Action层 Service层 ,modle层 和 Dao层的作用?Action层 Ser

java web-使用SSH框架,action向jsp 传值,如何把值传进区,并且还是在固定区域

问题描述 使用SSH框架,action向jsp 传值,如何把值传进区,并且还是在固定区域 后台传值传过来都是空的,并且值还不在固定区域 select top 12 tkfnews0_.id as id0_, tkfnews0_.TokenId as TokenId0_, tkfnews0_.newsid as newsid0_, tkfnews0_.parentid as parentid0_, tkfnews0_.childcount as childcount0_, tkfnews0_.ti

ssh-求助:SSH框架,页面上的数据无法提交到action中

问题描述 求助:SSH框架,页面上的数据无法提交到action中 这是页面 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getS