<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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.tkk7.com/rongxh7(心夢帆影JavaEE技術博客)
        

    posted on 2009-04-26 13:27 心夢帆影 閱讀(1789) 評論(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 得到解決,哎,,,,,,,,,,,  回復  更多評論
      
    主站蜘蛛池模板: a级成人毛片免费视频高清| 免费在线观看自拍性爱视频| 最近中文字幕完整免费视频ww| 亚洲乱码国产一区三区| 中文字幕免费观看视频| 亚洲精品高清国产一线久久| 精品国产污污免费网站| 久久亚洲美女精品国产精品| a拍拍男女免费看全片| 亚洲中文字幕日本无线码| 免费黄色网址入口| 老司机午夜精品视频在线观看免费| 四虎永久免费观看| 国产精品hd免费观看| 久久亚洲AV午夜福利精品一区| 永久黄色免费网站| 亚洲а∨天堂久久精品9966| 日韩电影免费在线| 国产黄色片免费看| 亚洲福利电影在线观看| 午夜免费福利网站| 久久久久久噜噜精品免费直播| 亚洲一区AV无码少妇电影☆| 久久99精品国产免费观看| 亚洲粉嫩美白在线| 2022中文字字幕久亚洲| 一级毛片在线免费看| 亚洲一区二区三区乱码在线欧洲| 国产福利免费在线观看| 十八禁视频在线观看免费无码无遮挡骂过 | 亚洲国产成人精品无码区在线观看| 8888四色奇米在线观看免费看| 亚洲中文字幕无码av| 亚洲高清最新av网站| 久久久久久国产精品免费免费男同 | 本道天堂成在人线av无码免费| 亚洲AV中文无码乱人伦下载 | 毛片免费全部播放一级| 成年免费大片黄在线观看com| 亚洲视频在线视频| 免费国产高清视频|