TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
hibernate 异常: : f9 ]1 D/ [3 H" J) h% @4 i. Q
Illegal attempt to associate a collection with two open sessions
8 ^# |( i6 K. f1.如以下找到的资料之一: 7 m ^+ C$ X2 z: [ n1 z3 Q' j
错误信息:
0 y" ] ?6 v6 V! k: t' o& v' Lorg.springframework.orm.hibernate3.HibernateSystemException: Illegal attempt to associate a collection with two open sessions;
6 U; J7 l" A- x& D错误原因: % V! c8 Y" R8 t7 C" U2 N
1. 一个Action在两个线程中同时运行,造成并发。
5 u. j. X8 I' ?1 V8 \解决方法:
2 ~! }. e; W- }8 ?1. 阻止重复提交。可以利用struts Token机制。 # R! k+ D0 V' H$ w+ t$ E
但是还是不能解决我的问题。 1 a. Z$ b: e& g+ E9 n! Z
2.经常debug 测试 终于发现了一个问题:
9 u! i& R& [" ?' k5 ? o 原来属性重名了 . M z5 y# y N
我在Action中已经注入了实体类 " e! A7 z$ T* g3 M" R
private Mission mission;
& R2 v0 }7 a5 ? m. G在下面某个内部类方法中也重名的定义 0 l) t1 Z5 Y$ |# ~% O
Mission mission = misList.get(0);
) q- @( r# D2 g8 I并且他们都被调用了同一方法
; W8 S) [7 u, m7 o! b' J$ T6 lmissionBussiness.addData(mis); ; B7 R3 p4 u( Q
处理结果:改掉其中的一个属性名,错误仍然存在。 " ~+ w& U! E6 c6 X8 O* S! x
( [* e% r, _( i3.找到资料 : 9 `) W0 l( G8 X7 N; ?" j0 ^; z/ t
在pring配置文件中的action bean中添加属性 scope="prototype" 问题依然存在。
; G: p+ m$ s f# @4.最后终于找到一个可以解决我问题的方案: % G& e; K( ?' n. K" C; I
使用hibenate的merge方法代替save、update等方法。
- U! z1 U1 K7 [; P, smerge和saveOrUpdate方法区别在于:merge方法是把我们提供的对象转变为托管状态的对象;而saveOrUpdate则是把我们提供的对象变成一个持久化对象;说的通俗一点就是:saveOrUpdate后的对象会纳入session的管理,对象的状态会跟数据库同步,再次查询该对象会直接从session中取,merge后的对 象不会纳入session的管理,再次查询该对象还是会从数据库中取。所以一般建议用merge 3 }! f1 U" F9 y$ C
9 X5 K% a: a* t
将MissionDaoImpl类中的 this.getHibernateTemplate().save(data); save方法改为了merge方法 . L/ S! L+ F4 q/ F, `5 b
- u) l+ J; T+ L
将此方法:public boolean addData(Object data) throws Exception { ' ^+ s/ r8 t, Y$ P' w5 N* N$ _3 q. v
this.getHibernateTemplate().save(data); ) ]- G# U2 L* k
return true; G4 F5 \5 T% _0 T& P% Y" |: N% w" S
} 1 ~3 M4 \" w+ Q8 E; p, y" g
改为:
5 c+ o3 ]+ _! d% M6 ppublic boolean addData(Object data) throws Exception { $ u; f( u2 A9 c$ C
this.getHibernateTemplate().merge(data); & M* L3 V7 Z* n+ V9 x- s1 B5 L: V" B
return true; & g5 k5 u4 j- F2 [! L
}
8 `7 k6 m5 }5 F/ L4 k将MissionDaoImpl类中的 this.getHibernateTemplate().update(data); update方法改为了merge方法 ) p! L7 o/ i. ?1 B
2 v, T0 I$ c9 c& B: ?8 d# Z; i+ ~; B将此方法:public void update(Object data) throws Exception {
( m9 ~2 c7 H3 ]+ @0 f! O super.getHibernateTemplate().update(data); & N6 G# d( p: x g$ A& u5 S* B$ z
} / x0 M3 U. D) [0 K
改为:public void update(Object data) throws Exception {
# b2 Q0 v b* d- V super.getHibernateTemplate().merge(data);
0 L# B" D1 T! f1 t+ B8 m' j( } T }
- F0 p' C/ a- j3 }/ ?/ ]- a R$ Y# a: u
8 e& f9 x# N9 H& r4 h
|
|