В JPA обнаружен цикл в графе объектов - PullRequest
2 голосов
/ 25 апреля 2010

Я пытаюсь выяснить эту ошибку с 5 часов безуспешно. Так что я наконец-то подумал о публикации здесь. Пожалуйста, помогите, я действительно в большой беде. Я застрял на этом и не вижу пути решения этой ошибки. Это моя структура базы данных

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.

Ответы [ 2 ]

4 голосов
/ 25 апреля 2010

Полагаю, вы используете ORM для получения данных из базы данных, а затем сериализации и отправки через веб-сервис. Поэтому, когда вы выбираете список 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, но не наоборот.

0 голосов
/ 09 февраля 2013

Решение состоит в том, чтобы просто добавить аннотацию:

import javax.xml.bind.annotation.XmlTransient;

@XmlTransient

в получателе свойства, которое вызывает цикл.

...