隨筆-42  評論-578  文章-1  trackbacks-0

              本文是我用EJB+JPA(Hibernate實現)+Web Service開發時,遇到的一些問題,查了許多地方,都找不到答案,請各位朋友耐心讀一下本文,有想法的歡迎留言!謝謝! 

              Category.java的部分代碼:

          1. @OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY,mappedBy="category")   
          2. public List<News> getNewsList() {   
          3.     return newsList;   
          4. }   
          5. public void setNewsList(List<News> newsList) {   
          6.     this.newsList = newsList;   
          7. }  

           

              News.java的部分代碼:

          1. @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE},fetch=FetchType.EAGER)   
          2. @JoinColumn(name="cid")   
          3. public Category getCategory() {   
          4.     return category;   
          5. }   
          6. public void setCategory(Category category) {   
          7.     this.category = category;   
          8. }  

           

             NewsDaoBean.java的部分代碼:

          1. @PersistenceContext(unitName="newspstn")   
          2. private EntityManager em;   
          3.   
          4. /**  
          5.  * 添加新聞  
          6.  * @param cid 項目編號  
          7.  * @param news  
          8.  */  
          9. public void saveNews(int cid,News news) {   
          10.     news.setCategory(em.find(Category.class, cid));   
          11.     em.persist(news);   
          12. }   
          13.   
          14. /**  
          15.  * 查詢所有新聞列表  
          16.  * @return  
          17.  */  
          18. @SuppressWarnings("unchecked")   
          19. public List<News> listNews() {   
          20.     return (List<News>)em.createQuery("from News n").getResultList();   
          21. }  

           

              業務邏輯層的類(NewsManager.java)比較簡單,由于篇幅問題,這里就不貼出來了。

             

              在還沒有發布成Web Service前,用Juint測試:

          1.  //測試保存新聞   
          2. public void testSaveNews() {   
          3.     InitialContext ctx;   
          4.     try {   
          5.         ctx = new InitialContext();   
          6.         NewsManager manager = (NewsManager)ctx.lookup("NewsManagerBean/remote");   
          7.         News news = new News();   
          8.         news.setTitle("title2");   
          9.         news.setAuthor("author2");   
          10.         news.setContent("content1");   
          11.         manager.saveNews(1, news);   
          12.     } catch (NamingException e) {   
          13.         System.out.println("NamingException");   
          14.         e.printStackTrace();   
          15.     }   
          16. }   
          17.   
          18. //測試查詢新聞列表   
          19. public void testListNews() {   
          20.     InitialContext ctx;   
          21.     try {   
          22.         ctx = new InitialContext();   
          23.         NewsManager manager = (NewsManager)ctx.lookup("NewsManagerBean/remote");   
          24.         List<News> newsList = manager.listNews();   
          25.         for(News news : newsList){   
          26.             System.out.println("news.title = " + news.getTitle());   
          27.         }   
          28.     } catch (NamingException e) {   
          29.         System.out.println("NamingException");   
          30.         e.printStackTrace();   
          31.     }   
          32. }  

             這個測試是沒有問題的,(testSaveNews和testListNews)能正常添加和查詢。

           

              當發布成Web Service后,在客戶端生成相應的服務代理類,再在Web服務的客戶端用Junit測試:

          1. //測試保存新聞   
          2. @Test  
          3. public void testSaveNews(){   
          4.     NewsManagerService service = new NewsManagerService();   
          5.     NewsManager manager = service.getNewsManagerPort();   
          6.     News news = new News();   
          7.     news.setTitle("title1");   
          8.     news.setAuthor("author1");   
          9.     news.setContent("content1");   
          10.     manager.saveNews(1, news);   
          11. }   
          12.   
          13. //測試查詢新聞列表   
          14. @Test  
          15. public void testListNews(){   
          16.     NewsManagerService service = new NewsManagerService();   
          17.     NewsManager manager = service.getNewsManagerPort();   
          18.     List<News> newsList = manager.listNews();     //------a1   
          19.     for(News news : newsList) {                             //--------a2   
          20.         System.out.println("news.title = " + news.getTitle());   //----a3   
          21.     }                         //------a4   
          22. }  

              這次測試,保存新聞的的操作(testSaveNews)能正常,但查詢新聞列表(testListNews)的操作卻拋以下異常

          1. 12:19:37,781 INFO  [STDOUT] Hibernate:    
          2.     select   
          3.         news0_.id as id1_,   
          4.         news0_.content as content1_,   
          5.         news0_.cid as cid1_,   
          6.         news0_.title as title1_,   
          7.         news0_.author as author1_,   
          8.         news0_.pubtime as pubtime1_    
          9.     from   
          10.         rong_news news0_   
          11. 12:19:37,781 INFO  [STDOUT] Hibernate:    
          12.     select   
          13.         category0_.id as id0_0_,   
          14.         category0_.cname as cname0_0_    
          15.     from   
          16.         rong_category category0_    
          17.     where   
          18.         category0_.id=?   
          19.   
          20. 12:19:37,796 ERROR [LazyInitializationException] failed to lazily initialize a collection of role: rong.entity.Category.newsList, no session or session was closed   
          21. org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: rong.entity.Category.newsList, no session or session was closed   
          22. (……相關的異常堆棧信息略……)   
          23.   
          24. 12:19:37,796 ERROR [RequestHandlerImpl] Error processing web service request   
          25. org.jboss.ws.WSException: javax.xml.ws.WebServiceException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: rong.entity.Category.newsList, no session or session was closed   
          26. (……相關的異常堆棧信息略……)   
          27.   
          28. Caused by: javax.xml.ws.WebServiceException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: rong.entity.Category.newsList, no session or session was closed   
          29. (……相關的異常堆棧信息略……)   
          30.   
          31. Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: rong.entity.Category.newsList, no session or session was closed   
          32. (……相關的異常堆棧信息略……)   
          33.   
          34. 12:19:37,890 ERROR [[NewsManagerBean]] Servlet.service() for servlet NewsManagerBean threw exception   
          35. org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: rong.entity.Category.newsList, no session or session was closed   
          36. (……相關的異常堆棧信息略……)  

           

          補充說明1:如果我把上面testListNews方法中的a1,a2,a3,a4行注釋掉,Junit測試是正常的。

          補充說明2:在Category類中,對List<News> newsList的設置,我確定是設置了延遲加載(Lazy)的,而且,我在查詢 新聞列表時,沒有用到news.getCategory.getNewsList()之類的操作。有個疑問:是不是設置的lazy加載,即使沒有用到,也會加載的?即使會加載的,為什么我在服務器端測試時能正常,而在Web Service的客戶端測試時,卻報錯?

           

          是EJB Web Service的Bug還是我的程序有錯誤?請大家討論!



          本文原創,轉載請注明出處,謝謝!http://www.aygfsteel.com/rongxh7(心夢帆影JavaEE技術博客)
              

          posted on 2009-04-26 13:27 心夢帆影 閱讀(1792) 評論(4)  編輯  收藏 所屬分類: EJB3WebService

          評論:
          # re: 是它的Bug還是我的錯誤:EJB的WebService客戶端報LazyInitializationException異常[未登錄] 2009-06-23 20:50 | freefly
          貌似和我的問題一模一樣ejb發布成webservice之前可以測試調用
          發布之后,生成代理類后可以插入,不能查詢出!不知 lz搞定這個問題沒·  回復  更多評論
            
          # re: 是它的Bug還是我的錯誤:EJB的WebService客戶端報LazyInitializationException異常 2010-09-09 16:35 | wothnet
          是延遲載加方面的問題。強制延遲加載的對象進行初始化!或者取消延遲加載  回復  更多評論
            
          # re: 是它的Bug還是我的錯誤:EJB的WebService客戶端報LazyInitializationException異常 2011-08-09 16:35 | 鵝鵝鵝
          怎么處理?  回復  更多評論
            
          # re: 是它的Bug還是我的錯誤:EJB的WebService客戶端報LazyInitializationException異常 2011-08-12 13:18 | xiaomaha
          這個問題我也遇到了,超級郁悶,無論是否延遲加載,只要用到ws都會出現session 問題,樓主是否解決此問題,請把解決方案貼出來啊,,,我現在只有通過@XmlTransient 加到實體中可以解決這樣的問題!用了這個方法只能讓webservice忽略它而已。但實際問題依然未被解決,還有一個問題,就是延遲加載關閉后,就會出現循環引用的bug,也只能通過@XmlTransient 得到解決,哎,,,,,,,,,,,  回復  更多評論
            
          主站蜘蛛池模板: 中江县| 扎兰屯市| 永吉县| 政和县| 福安市| 安阳市| 安达市| 静乐县| 山阳县| 五莲县| 双流县| 南开区| 鄢陵县| 泾川县| 咸宁市| 蓝田县| 乐东| 宁国市| 富平县| 藁城市| 浙江省| 襄汾县| 梁平县| 三门峡市| 吴堡县| 克拉玛依市| 星座| 彰化县| 台中县| 自贡市| 义马市| 阿拉善盟| 疏附县| 刚察县| 庐江县| 綦江县| 银川市| 客服| 安泽县| 哈尔滨市| 旺苍县|