TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
hibernate 异常:
& L. W0 i7 M; t' N4 q, pIllegal attempt to associate a collection with two open sessions
# z, F# [3 c$ P! d1 g7 x1.如以下找到的资料之一:
$ i) e, M! j( H: Y错误信息: . N: q: R+ t: C: w
org.springframework.orm.hibernate3.HibernateSystemException: Illegal attempt to associate a collection with two open sessions; - ?" r& G! Y: ~. G$ `' V' N
错误原因:
1 P( t$ ]3 R0 n1. 一个Action在两个线程中同时运行,造成并发。 6 A$ a, t, x# s( \: X2 b
解决方法: 9 S6 j* I; [# E* |5 U
1. 阻止重复提交。可以利用struts Token机制。
; O: g; {( A. F但是还是不能解决我的问题。
, p4 @8 A6 E; N/ [8 ]$ k. V! E2.经常debug 测试 终于发现了一个问题:
2 r4 x. v6 k! M* D" ?; T* p- Q 原来属性重名了 ; v/ e0 ~2 L3 e7 s& h! L8 f' w
我在Action中已经注入了实体类
_; [7 q* I" n, e; kprivate Mission mission;
0 v7 w8 v( [* N# D( |: b# ^2 Z6 G! Y在下面某个内部类方法中也重名的定义
: S0 I( ^8 y8 V1 R" ?+ }8 dMission mission = misList.get(0); " M5 ]+ f6 E3 @( c
并且他们都被调用了同一方法
7 e# v( ]- d. W/ z7 @' z" c- U% TmissionBussiness.addData(mis);
4 V& L+ _8 _* I7 {处理结果:改掉其中的一个属性名,错误仍然存在。 # ]. Z8 i8 Y9 _6 X
8 K* {4 ?9 |/ ~& C
3.找到资料 : ' y7 j9 R( e. j' U7 _, b
在pring配置文件中的action bean中添加属性 scope="prototype" 问题依然存在。
& m% ~- ?" l, S4 ~4 x- ?! f4.最后终于找到一个可以解决我问题的方案:
, M4 H- S5 f. o! K+ Y; C$ a2 q 使用hibenate的merge方法代替save、update等方法。
6 D- v/ Z G2 T% ^3 h \0 Tmerge和saveOrUpdate方法区别在于:merge方法是把我们提供的对象转变为托管状态的对象;而saveOrUpdate则是把我们提供的对象变成一个持久化对象;说的通俗一点就是:saveOrUpdate后的对象会纳入session的管理,对象的状态会跟数据库同步,再次查询该对象会直接从session中取,merge后的对 象不会纳入session的管理,再次查询该对象还是会从数据库中取。所以一般建议用merge
8 @) o: `6 Z+ @% b) F( t/ Y5 Q u* \( ?8 t. v, n4 m& j
将MissionDaoImpl类中的 this.getHibernateTemplate().save(data); save方法改为了merge方法 0 t& {* S# K! S" @3 R8 X& u1 s; n
1 G& b' q' D/ P$ u& ~2 I: ?4 o* M
将此方法:public boolean addData(Object data) throws Exception { ; z: m# M/ }" I* T+ j
this.getHibernateTemplate().save(data); ) M$ u* F. P5 t5 K
return true;
) W8 F2 i7 e; K) o } 0 h x6 J( k# R1 o" H/ A+ e6 g$ E8 J
改为: ! t5 ^9 r+ z" z9 b4 }
public boolean addData(Object data) throws Exception { , p. f- i' t+ c t5 s h% v: U8 n4 K
this.getHibernateTemplate().merge(data); ~4 r; b J: H$ r0 A7 U
return true; 5 O/ Y3 S$ w/ y1 i$ @* a& d, R
}
5 r8 j+ \7 I3 e; R将MissionDaoImpl类中的 this.getHibernateTemplate().update(data); update方法改为了merge方法
! }- n U: c/ m; q+ x) x7 A, x
8 X: K, g5 W1 b将此方法:public void update(Object data) throws Exception {
( e% L# s. U2 S- s) C8 w! K& n super.getHibernateTemplate().update(data);
0 r% l1 P5 V8 U& h! T3 B) d }
& b1 V8 e0 _) \. V# l3 _" f8 C改为:public void update(Object data) throws Exception {
) h7 V0 |, f5 J2 l$ O& ]! X super.getHibernateTemplate().merge(data); ! v: T; a2 }4 [( K7 D" R" C
}
3 ~ Q5 C8 Q& M6 c
7 L& j. x5 @5 b3 X
: v: G/ }6 T. j; z |
|