老生常谈的session的问题

目前的结构采用的是Struts+spring+hibernate,目前遇到一个问题,Riskdutyfactor表与riskDuty是多对多的关系,中间表为factorRiskDuty

配置文件如下:

RISKDUTY表:

xml 代码
  1. <hibernate-mapping>  
  2.     <class name="com.sleb.po.Riskduty" table="RISKDUTY" schema="XFLIU">  
  3.         <id name="riskdutyid" type="integer">  
  4.             <column name="RISKDUTYID" />  
  5.             <generator class="sequence" >  
  6.             <param name="sequence">S_RISKDUTY</param>  
  7.             </generator>  
  8.         </id>  
  9. .....   
  10.         <set name="riskdutyrisks" inverse="true">  
  11.             <key>  
  12.                 <column name="RISKDUTYID" />  
  13.             </key>  
  14.             <one-to-many class="com.sleb.po.Riskdutyrisk" />  
  15.         </set>  
  16.         <!-- 设计责任和责任要素的多对多的关联,手动修改过,中间表名称为FACTORRISKDUTY-->  
  17.         <set name="riskdutyfactors" table="FACTORRISKDUTY" cascade="save-update">  
  18.             <key>  
  19.                 <column name="RISKDUTYID" />  
  20.             </key>  
  21.             <many-to-many class="com.sleb.po.Riskdutyfactor" column="RISKDUTYFACTORID" />  
  22.         </set>  
  23.     </class>  
  24. </hibernate-mapping>  


------------------------

riskdutyfactor表映射文件: ----------先对以上进行解释,有一个界面是用来增加RISKDUTYFACTOR表中的数据的,另一个界面用来增加RISKDUTY数据的,在增加RISKDUTY的时候,需要使用RISKDUTYFACTOR表中的数据,由于是多对多的关系,因此增加FACTORRISKDUTY中间表.由以上可以知道riskduty增加的时候,再对中间表进行更新,因此设置RISKDUTY配置文件中的cascade="save-update"> 来维护关系,我想这个是正确的,因为我能正确的增加数据.RiskDutyService程序如下:
  

  1. // 保存一个责任要素   
  2. public boolean saveRiskduty(String dutyName, String dutyType,   
  3.   String[] baseChecked, String[] complexChecked) {     
  4.  riskDuty.setDutyname(dutyName);   
  5.  riskDuty.setDutytype(dutyType);   
  6.  if (baseChecked != null) {   
  7.   for (int i = 0; i < baseChecked.length; i++) {   
  8.    log.info(this.getRiskDutyFactorByPk(new Integer(baseChecked[i])).getFactorname());   
  9.    //首先根据页面上请求的ID,取得RiskDutyFactor对象,后与RiskDuty关联   
  10.    riskDuty.getRiskdutyfactors().add(this.getRiskDutyFactorByPk(new Integer(baseChecked[i])));       
  11.   }   
  12.  }   
  13.  if (complexChecked != null) {   
  14.   for (int i = 0; i < complexChecked.length; i++) {   
  15.    log.info(this.getRiskDutyFactorByPk(new Integer(complexChecked[i])).getFactorname());   
  16. /    首先根据页面上请求的ID,取得RiskDutyFactor对象,后与RiskDuty关联   
  17.    riskDuty.getRiskdutyfactors().add(this.getRiskDutyFactorByPk(new Integer(complexChecked[i])));   
  18.   }   
  19.  }   
  20.  log.info("begin save complexCheck riskDuty");   
  21.  this.getRiskDutyDAO().save(riskDuty);   
  22.   
  23.  bl=true;   
  24.  //this.getRiskDutyFactorDAO().getCurrentSession().clear();   
  25.     
  26.  return bl;   
  27. }   

第一次增加riskduty是没有任何问题的,但是第2次的时候,报如下错误:org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.sleb.po.Riskdutyfactor#1]

----------我知道出现的问题是在this.getRiskDutyFactorByPk(new Integer(baseChecked[i])));    但是在网上找了很对解决办法,都没有实现,比较纳闷,所以写在自己的BLOG中,请看看怎么修改.

this.getRiskDutyFactorByPk(new Integer(baseChecked[i])));   对它也进行说明,我们是在riskDutyService中增加了

 //根据责任要素主键,取得一个责任要素对象,该方法避免了service调用service是的事务调用事务的问题
 public Riskdutyfactor getRiskDutyFactorByPk(Integer id) {
   return (Riskdutyfactor)this.getRiskDutyFactorDAO().getByPk(Riskdutyfactor.class,id);
 }

方法直接调用RiskDutyFactorDAO中的方法,这样做的目的是避免了使用riskDutyService调用riskDutyFactorService.因此spring 中的配置文件修改为:
 
 请教高手!

xml 代码

<bean id="riskDutyService" parent="proxyTemplate"></bean>

  1. <!--riskDuty service -->  
  2.     <bean id="riskDutyService" parent="proxyTemplate">  
  3.         <property name="target">  
  4.             <bean class="com.sleb.service.riskDuty.spring.RiskDutyServiceImpl">  
  5.                 <property name="riskDutyDAO">  
  6.                     <ref local="riskDutyDAO" />  
  7.                 </property>  
  8.                 <property name="riskDutyFactorDAO">  
  9.                     <ref local="riskDutyFactorDAO" />  
  10.                 </property>  
  11.             </bean>  
  12.         </property>  
  13.     </bean>  
  14.     <bean id="riskDutyDAO" class="com.sleb.dao.riskDuty.RiskDutyDAOImpl">  
  15.         <property name="sessionFactory">  
  16.             <ref bean="sessionFactory" />  
  17.         </property>  
  18.     </bean>  

 

xml 代码
  1. <hibernate-mapping>  
  2.     <class name="com.sleb.po.Riskdutyfactor" table="RISKDUTYFACTOR" schema="XFLIU">  
  3.         <id name="riskdutyfactorid" type="integer">  
  4.             <column name="RISKDUTYFACTORID" />  
  5.             <generator class="sequence" >  
  6.             <param name="sequence">S_RISKDUTYFACTOR</param>  
  7.             </generator>  
  8.         </id>  
  9.         <property name="factorname" type="string">  
  10.             <column name="FACTORNAME" length="20" />  
  11.         </property>  
  12.         <property name="factorunit" type="string">  
  13.             <column name="FACTORUNIT" length="120" />  
  14.         </property>  
  15.         <property name="value" type="string">  
  16.             <column name="VALUE" length="120" />  
  17.         </property>  
  18.         <property name="sign" type="string">  
  19.             <column name="SIGN" length="1" />  
  20.         </property>  
  21.         <property name="language" type="string">  
  22.             <column name="LANGUAGE" length="1" />  
  23.         </property>  
  24.         <!-- 设计责任要素和责任的多对多的关联,手动修改过,中间表名称为FACTORRISKDUTY-->  
  25.         <set name="riskduties" table="FACTORRISKDUTY"  inverse="true" cascade="none">  
  26.             <key>  
  27.                 <column name="RISKDUTYFACTORID" />  
  28.             </key>  
  29.             <many-to-many class="com.sleb.po.Riskduty" column="RISKDUTYID" />  
  30.         </set>  
  31.     </class>  
  32. </hibernate-mapping>  


<hibernate-mapping></hibernate-mapping>

java 代码
基于51单片机,实现对直流电机的调速、测速以及正反转控制。项目包含完整的仿真文件、源程序、原理图和PCB设计文件,适合学习和实践51单片机在电机控制方面的应用。 功能特点 调速控制:通过按键调整PWM占空比,实现电机的速度调节。 测速功能:采用霍尔传感器非接触式测速,实时显示电机转速。 正反转控制:通过按键切换电机的正转和反转状态。 LCD显示:使用LCD1602液晶显示屏,显示当前的转速和PWM占空比。 硬件组成 主控制器:STC89C51/52单片机(与AT89S51/52、AT89C51/52通用)。 测速传感器:霍尔传感器,用于非接触式测速。 显示模块:LCD1602液晶显示屏,显示转速和占空比。 电机驱动:采用双H桥电路,控制电机的正反转和调速。 软件设计 编程语言:C语言。 开发环境:Keil uVision。 仿真工具:Proteus。 使用说明 液晶屏显示: 第一行显示电机转速(单位:转/分)。 第二行显示PWM占空比(0~100%)。 按键功能: 1键:加速键,短按占空比加1,长按连续加。 2键:减速键,短按占空比减1,长按连续减。 3键:反转切换键,按下后电机反转。 4键:正转切换键,按下后电机正转。 5键:开始暂停键,按一下开始,再按一下暂停。 注意事项 磁铁和霍尔元件的距离应保持在2mm左右,过近可能会在电机转动时碰到霍尔元件,过远则可能导致霍尔元件无法检测到磁铁。 资源文件 仿真文件:Proteus仿真文件,用于模拟电机控制系统的运行。 源程序:Keil uVision项目文件,包含完整的C语言源代码。 原理图:电路设计原理图,详细展示了各模块的连接方式。 PCB设计:PCB布局文件,可用于实际电路板的制作。
【四旋翼无人机】具备螺旋桨倾斜机构的全驱动四旋翼无人机:建模与控制研究(Matlab代码、Simulink仿真实现)内容概要:本文围绕具备螺旋桨倾斜机构的全驱动四旋翼无人机展开研究,重点进行了系统建模与控制策略的设计与仿真验证。通过引入螺旋桨倾斜机构,该无人机能够实现全向力矢量控制,从而具备更强的姿态调节能力和六自由度全驱动特性,克服传统四旋翼欠驱动限制。研究内容涵盖动力学建模、控制系统设计(如PID、MPC等)、Matlab/Simulink环境下的仿真验证,并可能涉及轨迹跟踪、抗干扰能力及稳定性分析,旨在提升无人机在复杂环境下的机动性与控制精度。; 适合人群:具备一定控制理论基础和Matlab/Simulink仿真能力的研究生、科研人员及从事无人机系统开发的工程师,尤其适合研究先进无人机控制算法的技术人员。; 使用场景及目标:①深入理解全驱动四旋翼无人机的动力学建模方法;②掌握基于Matlab/Simulink的无人机控制系统设计与仿真流程;③复现硕士论文级别的研究成果,为科研项目或学术论文提供技术支持与参考。; 阅读建议:建议结合提供的Matlab代码与Simulink模型进行实践操作,重点关注建模推导过程与控制器参数调优,同时可扩展研究不同控制算法的性能对比,以深化对全驱动系统控制机制的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值