目前的结构采用的是Struts+spring+hibernate,目前遇到一个问题,Riskdutyfactor表与riskDuty是多对多的关系,中间表为factorRiskDuty
配置文件如下:
RISKDUTY表:
- <hibernate-mapping>
- <class name="com.sleb.po.Riskduty" table="RISKDUTY" schema="XFLIU">
- <id name="riskdutyid" type="integer">
- <column name="RISKDUTYID" />
- <generator class="sequence" >
- <param name="sequence">S_RISKDUTY</param>
- </generator>
- </id>
- .....
- <set name="riskdutyrisks" inverse="true">
- <key>
- <column name="RISKDUTYID" />
- </key>
- <one-to-many class="com.sleb.po.Riskdutyrisk" />
- </set>
- <!-- 设计责任和责任要素的多对多的关联,手动修改过,中间表名称为FACTORRISKDUTY-->
- <set name="riskdutyfactors" table="FACTORRISKDUTY" cascade="save-update">
- <key>
- <column name="RISKDUTYID" />
- </key>
- <many-to-many class="com.sleb.po.Riskdutyfactor" column="RISKDUTYFACTORID" />
- </set>
- </class>
- </hibernate-mapping>
------------------------
riskdutyfactor表映射文件: ----------先对以上进行解释,有一个界面是用来增加RISKDUTYFACTOR表中的数据的,另一个界面用来增加RISKDUTY数据的,在增加RISKDUTY的时候,需要使用RISKDUTYFACTOR表中的数据,由于是多对多的关系,因此增加FACTORRISKDUTY中间表.由以上可以知道riskduty增加的时候,再对中间表进行更新,因此设置RISKDUTY配置文件中的cascade="save-update"> 来维护关系,我想这个是正确的,因为我能正确的增加数据.RiskDutyService程序如下:
- // 保存一个责任要素
- public boolean saveRiskduty(String dutyName, String dutyType,
- String[] baseChecked, String[] complexChecked) {
- riskDuty.setDutyname(dutyName);
- riskDuty.setDutytype(dutyType);
- if (baseChecked != null) {
- for (int i = 0; i < baseChecked.length; i++) {
- log.info(this.getRiskDutyFactorByPk(new Integer(baseChecked[i])).getFactorname());
- //首先根据页面上请求的ID,取得RiskDutyFactor对象,后与RiskDuty关联
- riskDuty.getRiskdutyfactors().add(this.getRiskDutyFactorByPk(new Integer(baseChecked[i])));
- }
- }
- if (complexChecked != null) {
- for (int i = 0; i < complexChecked.length; i++) {
- log.info(this.getRiskDutyFactorByPk(new Integer(complexChecked[i])).getFactorname());
- / 首先根据页面上请求的ID,取得RiskDutyFactor对象,后与RiskDuty关联
- riskDuty.getRiskdutyfactors().add(this.getRiskDutyFactorByPk(new Integer(complexChecked[i])));
- }
- }
- log.info("begin save complexCheck riskDuty");
- this.getRiskDutyDAO().save(riskDuty);
- bl=true;
- //this.getRiskDutyFactorDAO().getCurrentSession().clear();
- return bl;
- }
第一次增加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 中的配置文件修改为:
请教高手!
<bean id="riskDutyService" parent="proxyTemplate"></bean>
- <!--riskDuty service -->
- <bean id="riskDutyService" parent="proxyTemplate">
- <property name="target">
- <bean class="com.sleb.service.riskDuty.spring.RiskDutyServiceImpl">
- <property name="riskDutyDAO">
- <ref local="riskDutyDAO" />
- </property>
- <property name="riskDutyFactorDAO">
- <ref local="riskDutyFactorDAO" />
- </property>
- </bean>
- </property>
- </bean>
- <bean id="riskDutyDAO" class="com.sleb.dao.riskDuty.RiskDutyDAOImpl">
- <property name="sessionFactory">
- <ref bean="sessionFactory" />
- </property>
- </bean>
- <hibernate-mapping>
- <class name="com.sleb.po.Riskdutyfactor" table="RISKDUTYFACTOR" schema="XFLIU">
- <id name="riskdutyfactorid" type="integer">
- <column name="RISKDUTYFACTORID" />
- <generator class="sequence" >
- <param name="sequence">S_RISKDUTYFACTOR</param>
- </generator>
- </id>
- <property name="factorname" type="string">
- <column name="FACTORNAME" length="20" />
- </property>
- <property name="factorunit" type="string">
- <column name="FACTORUNIT" length="120" />
- </property>
- <property name="value" type="string">
- <column name="VALUE" length="120" />
- </property>
- <property name="sign" type="string">
- <column name="SIGN" length="1" />
- </property>
- <property name="language" type="string">
- <column name="LANGUAGE" length="1" />
- </property>
- <!-- 设计责任要素和责任的多对多的关联,手动修改过,中间表名称为FACTORRISKDUTY-->
- <set name="riskduties" table="FACTORRISKDUTY" inverse="true" cascade="none">
- <key>
- <column name="RISKDUTYFACTORID" />
- </key>
- <many-to-many class="com.sleb.po.Riskduty" column="RISKDUTYID" />
- </set>
- </class>
- </hibernate-mapping>
<hibernate-mapping></hibernate-mapping>

1144

被折叠的 条评论
为什么被折叠?



