`
liutjedu
  • 浏览: 46662 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
社区版块
存档分类
最新评论

老生常谈的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 代码
分享到:
评论
1 楼 liutjedu 2007-02-09  
da大家能看到吗?我怎么看不到啊!奇怪!

相关推荐

    老生常谈Session和Cookie之间区别与联系(必看篇)

    在实际开发中,对Session和Cookie的管理需要特别注意安全性问题。例如,需要在服务器端对Session进行定期更新和失效机制,防止Session劫持;同时对Cookie的传输使用加密、设置HttpOnly属性等手段防止跨站脚本攻击...

    老生常谈外链 站长要做到对症下药.pps

    老生常谈外链 站长要做到对症下药.pps

    Java中文问题及最优解决方法

    由于Java编程中的中文问题是一个老生常谈的问题,在阅读了许多关于Java中文问题解决方法之后,结合作者的编程实践,我发现过去谈的许多方法都不能清晰地说明问题及解决问题,尤其是跨平台时的中文问题。于是我给出此...

    老生常谈的24种Java设计模式

    Java设计模式是在特定环境下,为了解决某类重复出现的问题而总结出来的一套成功或有效的解决方案。这些设计模式旨在提高代码的可重用性、可维护性和可扩展性。 设计模式通常包含以下几个关键要素: 模式名称:通过一...

    电子技术的老生常谈——接地.pdf

    正如标题所言,《电子技术的老生常谈——接地》一文中提到的那样,尽管接地的基本概念在每一次培训和交流中都会被提及,但往往缺乏一个通用而全面的方法论指导。本文旨在深入探讨接地的各种类型、目的以及具体的实施...

    老生常谈javascript的面向对象思想

    第二种方式是通过共享同一个函数来避免重复定义函数,这虽然解决了内存使用的问题,但是从语义上讲,函数与对象的关联度不高,可能导致代码的可读性降低。 第四种是构造函数方式。这种方式中,构造函数可以认为是一...

    老生常谈ProgressBar、ProgessDialog的用法

    ProgressBar和ProgressDialog是Android开发中常见的两种进度条控件,用于展示任务执行的进度或等待状态。下面我们将深入探讨这两种控件的用法。 首先,ProgressBar是一个可以显示具体进度的组件,它可以是圆形或...

    老生常谈遮罩层 滚动条的问题

    今天遇到的问题是,在弹出层后面的 遮罩层,因为有滚动条,导致滚动条下面不可视区域没有遮罩层,解决方式是加的css。 js代码 [removed] //显示灰色JS遮罩层 function showBg(ct,content){ var bH=$(document)....

    解决 U-Boot ping不通虚拟机的问题

    老生常谈 虚拟机的网络配置 设置桥接模式 接下来打开虚拟网络编辑器 注意手动选择你电脑的有线网卡 解决虚拟机无法上网的问题 上面几步完成后可能会出现虚拟机连不上网的情况 3. 设置共享网络 既然用网线连接PC...

    老生常谈android中的事件传递和处理机制

    在Android开发中,事件传递和处理机制是相当关键的一个部分,尤其对于用户界面的交互有着决定性的影响。本文主要探讨了Android系统如何处理触摸事件,通过拟人化的比喻来解释事件传递的流程,并通过实际代码示例进行...

    Java中文乱码解决之道

    java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.com来解决问题。阅读许多关于中文乱码的解决办法的博文后,发现对于该问题我们都(更加包括我自己)没有...

    js老生常谈之this,constructor ,prototype全面解析

    javascript中的this,constructor ,prototype,都是老生常谈的问题,深入理解他们的含义至关重要。在这里,我们再来复习一下吧,温故而知新! this this表示当前对象,如果在全局作用范围内使用this,则指代当前页面...

    老生常谈C++中实参形参的传递问题

    "C++中实参形参的传递问题" 在 C++ 中,函数参数的传递是非常重要的概念。函数参数的传递方式对函数的执行结果和性能都有着重要的影响。今天,我们就来探讨 C++ 中实参形参的传递问题。 首先,让我们来了解什么是...

    老生常谈计算机中的编码问题(必看篇)

    计算机中的编码问题是一个至关重要的概念,它涉及到计算机如何理解和处理文本信息。计算机本质上只能处理数字,因此,要处理文本,就必须将文本转换成数字形式。本文主要探讨了几种常见的编码方式,包括ASCII编码、...

    浅探中国电子商务发展中的问题与对策-1.docx

    安全问题是电子商务中的老生常谈,但老生常谈常常说明非常重要且解决得不够理想。可以说目前阻碍个人或企业进行网上交易的最大的心理障碍,就是电子交易平台及网络的安全问题。 2. 物流水平落后 电子商务的优势...

    老生常谈JavaScript面向对象基础与this指向问题

    本文将深入探讨面向对象的基础概念,包括面向过程与面向对象的区别,以及JavaScript中特有的this指向问题。 首先,我们要理解面向过程和面向对象的区别。面向过程编程是一种自下而上的编程范式,关注解决问题的具体...

    老生常谈python中的重载

    所谓重载,就是多个相同函数名的函数,根据传入的参数个数,参数类型而执行不同的功能。所以函数重载实质上是为了解决编程中参数可变不统一的问题。这篇文章主要介绍了老生常谈python中的重载,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics