因为lazy的问题,还是采用了OpenSessionInView
一开始我的web.xml配置文件如下:

     < filter >  
        
< filter-name > opensession </ filter-name >  
        
< filter-class > org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </ filter-class >  
    
</ filter >  
写了个保存的代码测试了一下,报如下的错误:

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations 
are not allowed in read
- only mode (FlushMode.NEVER)  -  turn your Session 
into FlushMode.AUTO or remove 
' readOnly '  marker from transaction definition 
        at org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:
1076
        at org.springframework.orm.hibernate3.HibernateTemplate$
12 .doInHibernate(HibernateTemplate.java: 616
        at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:
366
        at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:
614
        at com.phopesoft.security.service.impl.UserServiceImpl.addUser(UserServiceImpl.java:
40
        at com.phopesoft.security.web.UserAction.add(UserAction.java:
52
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25
        at java.lang.reflect.Method.invoke(Method.java:
585
        at com.opensymphony.xwork.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:
365
dot.gifdot.gifdot.gifdot.gifdot.gif

在javaeye中搜索了一下,发现了Readonly的帖子,将web.xml修改为如下:

< filter >  
        
< filter-name > opensession </ filter-name >  
        
< filter-class > org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </ filter-class >  
        
< init-param >  
            
< param-name > singleSession </ param-name >  
            
< param-value > false </ param-value >  
        
</ init-param >  
    
</ filter >  


保存的代码顺利通过测试,但是删除的代码却不能通过了.出现如下的错误:

org.hibernate.HibernateException: Illegal attempt to associate a collection 
with two open sessions 
        at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:
410
        at org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:
40
        at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:
101
        at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:
61
        at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:
55
        at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:
123
        at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:
72
        at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:
790
        at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:
768
        at org.springframework.orm.hibernate3.HibernateTemplate$
25 .doInHibernate(HibernateTemplate.java: 772
        at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:
366
        at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:
766
        at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:
762

同样在论坛里面搜索到遇到这个问题的朋友,回帖说去掉singleSession!

迷惑了 02.gif