2010-04-25 40 views
2

我試圖找出這個錯誤,因爲5個小時沒有任何成功。所以我終於想到了在這裏發佈。請幫助我真的很麻煩。我堅持這一點,並沒有辦法解決這個錯誤。這是我的數據庫結構在JPA中檢測到的對象圖中的一個循環

tblBlogRegion         

BlogRegionId (primary key)    
BlogRegionName         


tblGadget 

GadgetId(primary key) 
GadgetName 

tblBlogs 

BlogId(primary key)      
Blogname 
BlogTypeId (reference key from tblSiteTerm 


tblSiteTerms   

SiteTermsId(primary key)   
SiteTermsName 


tblBlogGadgets 

BlogGadgetsId(primary key) 
BlogRegionId(foreign key from tblBlogRegion) 
BlogId(foreign key from tblBlog) 
GadgetId(foreign key from tblGadget) 

這不正常的數據庫結構嗎?你看到任何循環的東西嗎?當我嘗試獲取來自tblGadgets列表中我得到這個錯誤: -

[com.sun.istack.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML: entity.BlogGadgets[blogGadgetsId=1] -> entity.Blogs[blogId=2] -> entity.BlogGadgets[blogGadgetsId=1]] 

我想從使用JAS-WS Web服務列表。

+0

從上面的僞代碼是不可能告訴。 – 2010-04-25 04:51:07

+0

您可以嘗試以下鏈接1. [link1](http://jaxb.java.net/guide/Mapping_cyclic_references_to_XML.html)2. [link2](http://eduveks.blogspot.com/2010/09/web- service-cycle-is-detected-in-object.html?showComment = 1312437105951#c7357109666927544347) – 2011-08-04 07:17:26

回答

4

我想你正在使用一些ORM從數據庫中獲取數據,然後序列化並通過Web服務發送。 所以,當你取的BlogGadgets名單,他們有它Blogs,但同樣Blogs具有相同BlogGadgets等的列表...

這就是所謂的循環引用,它很常見,讓他們在你的對象模型但是當你想發送它時,你需要確保你擁有的對象圖是一棵樹,至少對於你正在使用的序列化器來說。

一個解決方案,這將是改變您使用的是數據傳輸對象,這將有適當的樹狀結構/映射域對象/實體(在C#中,但它應該是在Java漂亮相同)

[Serializable] 
public class BlogGadgetDto 
{ 
    public int GadgetId {get;set;} 
    public BlogSmallDto Blog {get;set;} 
    // and so on 
} 

[Serializable] 
public class BlogSmallDto 
{ 
    public int BlogId {get;set;} 
    public string BlogName {get;set;} 
    // and so on 
} 

請注意,現在BlogGadgetDto引用BlogSmallDto,但不是相反。

+3

太棒了!我希望我能給你10票。我已經解決了我的問題。我在bloggadget中標記了將博客集合作爲@XmlTransient,並且它像魅力一樣工作。必須爲我的其他實體執行此操作。謝謝miensol! – TCM 2010-04-25 05:00:25

-1

的解決方案是簡單地添加註解:

import javax.xml.bind.annotation.XmlTransient; 

@XmlTransient 

在使所述循環的屬性的吸氣劑。

+0

通過使用@XmlTransient註釋,您將只排除指定的類映射... – sataniccrow 2013-04-30 09:14:05