TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
hibernate 异常:
6 D3 m) p; K" ^: ]# B: @; q! yIllegal attempt to associate a collection with two open sessions 6 e; S+ u- ~+ Q6 Z& S J
1.如以下找到的资料之一: ( @0 c1 \& O+ g n# p/ J$ s
错误信息: / L5 q- V4 F& {; O
org.springframework.orm.hibernate3.HibernateSystemException: Illegal attempt to associate a collection with two open sessions;
) A1 N# E' n/ x# w% ]错误原因: ! w( S1 m2 j" w4 y! z& ^: W
1. 一个Action在两个线程中同时运行,造成并发。
, P7 D/ e# M( N U解决方法:
6 _2 Z8 d% T* X; l1. 阻止重复提交。可以利用struts Token机制。 / K9 `! h$ ?6 |7 x& ?
但是还是不能解决我的问题。
9 G i. ]& Y& j: z" T2.经常debug 测试 终于发现了一个问题: 2 o9 N7 v. ?& k5 g0 x
原来属性重名了 / U; n8 _% }5 X0 M, B8 L
我在Action中已经注入了实体类 ; U: X! i- T) C
private Mission mission;
7 A: p8 c _' e' Q& }5 ?在下面某个内部类方法中也重名的定义
, w: G. D! U% M* M' b) |3 n) u, hMission mission = misList.get(0);
* k, G$ t# m6 }/ R并且他们都被调用了同一方法
4 v6 G: a* I6 q1 VmissionBussiness.addData(mis); + D, @1 Z+ @* y! y9 x! g
处理结果:改掉其中的一个属性名,错误仍然存在。 ; T6 L' y1 q2 A* a* U8 j
7 V) m( W. o6 B9 T8 G+ D3.找到资料 : 8 D r4 _, ^! `9 L6 f% ~7 G
在pring配置文件中的action bean中添加属性 scope="prototype" 问题依然存在。
# `+ h# P5 X8 Q m Q* c! {6 d0 Y4.最后终于找到一个可以解决我问题的方案:
: J, L% t0 D" b* A1 [; ]" C7 _ 使用hibenate的merge方法代替save、update等方法。 5 S/ T) a) t3 k; j
merge和saveOrUpdate方法区别在于:merge方法是把我们提供的对象转变为托管状态的对象;而saveOrUpdate则是把我们提供的对象变成一个持久化对象;说的通俗一点就是:saveOrUpdate后的对象会纳入session的管理,对象的状态会跟数据库同步,再次查询该对象会直接从session中取,merge后的对 象不会纳入session的管理,再次查询该对象还是会从数据库中取。所以一般建议用merge , T9 F) W. S: k6 s/ C9 ]6 Q
( b# @: g8 W! s/ X' p8 l. P0 ^
将MissionDaoImpl类中的 this.getHibernateTemplate().save(data); save方法改为了merge方法
9 w6 i+ |9 a0 M+ K. w( e1 T$ N6 Y0 A& W$ z7 O4 p( G+ ? Z
将此方法:public boolean addData(Object data) throws Exception { * G& J& l3 u/ t9 _- `
this.getHibernateTemplate().save(data); 7 x# \2 @7 W; q) a! |' t
return true; , `# @4 O( i% Y% E
} ) ^- C" ?. N! z$ `
改为: 0 F+ h5 z- a1 c/ }& ~" A9 ~6 K) v& Q
public boolean addData(Object data) throws Exception {
9 C, p$ a5 N, k) D/ O, {, b this.getHibernateTemplate().merge(data); 9 N* D" |- r( Z+ k7 l' L- S7 J% w
return true;
. ~" W2 X4 \1 b! |( u, K! A5 T }
: \' H h' |) E/ q5 l将MissionDaoImpl类中的 this.getHibernateTemplate().update(data); update方法改为了merge方法 - \, E/ s# z: \7 D" ~. V5 S
/ q( F! V! }* Q6 U/ R! F& `将此方法:public void update(Object data) throws Exception { 4 q# b! \; |9 e6 C; I
super.getHibernateTemplate().update(data); 7 W; i( K4 G" o" E2 m2 F" h
}
: I6 h0 J% c1 ]% U5 f0 P改为:public void update(Object data) throws Exception { # U" {$ e' ?- l( y0 n/ a
super.getHibernateTemplate().merge(data); 3 i1 I( W4 i* y& Z
}
3 h- V6 D' ^" d! J: G$ X7 \/ B' U3 ?1 L* p( ^1 d* J3 ?
" n7 ~. [% R! K0 e& [ |
|