2010-04-25 120 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

相关问题