当前位置: 首页 > 知识库问答 >
问题:

Hibernate-JPA中的无限递归[重复]

单于奇略
2023-03-14

我得到了错误下的无限递归。

Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSDocumentClass$HibernateProxy$u3IXr3xN["groups"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSGroupBean["docClasses"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSDocumentClass$HibernateProxy$u3IXr3xN["groups"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSGroupBean["docClasses"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSDocumentClass$HibernateProxy$u3IXr3xN["groups"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSGroupBean["docClasses"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSDocumentClass$HibernateProxy$u3IXr3xN["groups"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSGroupBean["docClasses"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSDocumentClass$HibernateProxy$u3IXr3xN["groups"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSGroupBean["docClasses"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSDocumentClass$HibernateProxy$u3IXr3xN["groups"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSGroupBean["docClasses"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSDocumentClass$HibernateProxy$u3IXr3xN["groups"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSGroupBean["docClasses"]]

下面是我的代码

    @Entity
    @Table(name="DMS_Document_Class")
    public class DMSDocumentClass {

        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        @Column(name="DocumentClass_Index_ID")
        private long docClassindexID;


        @ManyToMany(fetch = FetchType.LAZY)
        @JoinTable(name = "DOCCLASS_GROUP", 
        joinColumns = {@JoinColumn(referencedColumnName ="DocumentClass_Index_ID")}, inverseJoinColumns = {@JoinColumn(referencedColumnName="groupID")})
        private List<DMSGroupBean> groups;


        @Column(name="Document_Class_Name")
        private String documentClassName;

        @Column(name="Document_Priority")
        private int documentPriority;

        @Column(name="createdDate")
        private Date createdDate;

        @Column(name="createdBy")
        private String createdBy;

另一个班

    @Entity
    @Table(name="DMS_Group", indexes= @Index(columnList="groupName"),
                uniqueConstraints={@UniqueConstraint(columnNames={"groupName"})})
    public class DMSGroupBean {

        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        @Column(name="groupID")
        private long groupID;

        @Column(name="groupName")
        private String groupName;

        @Column(name="createDate")
        private Date createDate;

        @ManyToMany(mappedBy = "groups",fetch = FetchType.LAZY)
        private List<DMSUser> users;

        @ManyToMany(mappedBy = "groups",fetch = FetchType.LAZY)
        private List<DMSDocumentClass> docClasses;

        @Transient
        private String status;

我无法理解为什么在UI上获取此值时会出现此错误。

    @Transactional
        public HashMap<String, Object> getDocListByFolderID(@NonNull long folderID, HttpSession session) {



            DMSFolder currentFolder = folderRepo.findById(folderID).get();

            List<DMSDocument> documents =  documentRepository.findByDocumentFolderID(folderID);

            List<DMSFolder> fetchedSubfolders = folderRepo.findByParentFolderID(folderID);

            //Allow those folder which has rights for this user
            DMSUser userInfo = (DMSUser) session.getAttribute("userinfo");
            List<DMSGroupBean> groups = userInfo.getGroups();//userInfo.getGroupRights();

            List<DMSFolder> finalSubfolders = fetchFinalSubFolders(groups, fetchedSubfolders);

            DMSFolder parentFolder = null;
            if(currentFolder.getParentFolderID() != 0) {
                parentFolder = folderRepo.findById(currentFolder.getParentFolderID()).get();
            }


            HashMap<String, Object> docList = new HashMap<String, Object>();

            docList.put("currentFolder", currentFolder);
            docList.put("documents", documents);
            docList.put("subfolders", finalSubfolders);
            docList.put("parentFolder", parentFolder);

            return docList;
        }

共有2个答案

卞俊贤
2023-03-14

如前所述,是双向映射导致了问题。JsonIgnore将解决您的问题,但是,我建议您使用JsonManagedReference和JsonBackReference。不同之处在于,JsonIgnore将把字段序列化为null,而JsonBackReference将用其ID(通过应用于该类的JsonIdentityInfo注释)序列化集合。

 @Entity
@Table(name="DMS_Group", indexes= @Index(columnList="groupName"),
            uniqueConstraints={@UniqueConstraint(columnNames={"groupName"})})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "groupID")
public class DMSGroupBean {

   @ManyToMany(mappedBy = "groups",fetch = FetchType.LAZY)
   @JsonManageReference
   private List<DMSDocumentClass> docClasses;

@Entity
@Table(name="DMS_Document_Class")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "docClassindexID")
public class DMSDocumentClass {

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "DOCCLASS_GROUP", 
    joinColumns = {@JoinColumn(referencedColumnName ="DocumentClass_Index_ID")}, inverseJoinColumns = {@JoinColumn(referencedColumnName="groupID")})
    @JsonBackReference
    private List<DMSGroupBean> groups;
司浩壤
2023-03-14

你得到了这个StackOverflowException,因为你的JPA实体之间存在双向关系。当Jackson试图对其进行反序列化时,它会跟随对象图,而对象图永远不会以DMSGroupBeanDMSDocumentClass引用自身而结束。

考虑在一个关系网站上使用@JsonIgnore,比如:

@Entity
@Table(name="DMS_Group", indexes= @Index(columnList="groupName"),
            uniqueConstraints={@UniqueConstraint(columnNames={"groupName"})})
public class DMSGroupBean {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="groupID")
    private long groupID;

    @Column(name="groupName")
    private String groupName;

    @Column(name="createDate")
    private Date createDate;

    @ManyToMany(mappedBy = "groups",fetch = FetchType.LAZY)
    private List<DMSUser> users;

    @ManyToMany(mappedBy = "groups",fetch = FetchType.LAZY)
    @JsonIgnore // here
    private List<DMSDocumentClass> docClasses;

    @Transient
    private String status;

}
 类似资料:
  • 产品类别: 提供程序类: Prices_1类:

  • 当尝试将具有双向关联的JPA对象转换为JSON时,我不断得到 我所发现的就是这条线索,它的基本结论是建议避免双向关联。有没有人有办法解决这个spring bug? ------编辑2010-07-24 16:26:22------- 代码片段: 业务对象1: 业务对象2: 控制器: JPA-见习DAO的实施: 坚持不懈xml

  • 问题内容: 当尝试将具有双向关联的JPA对象转换为JSON时,我不断 我所发现的只是该线程,基本上以建议避免双向关联为结尾。有谁知道这个春季错误的解决方法? ------编辑2010-07-24 16:26:22 ------- 代码段: 业务对象1: 业务对象2: 控制器: JPA实施学员DAO: persistence.xml 问题答案: 您可以使用它来打破循环。

  • 问题内容: 尝试将具有双向关联的JPA对象转换为JSON时,我不断 我所发现的只是该线程,基本上以建议避免双向关联为结尾。有谁知道这个Spring错误的解决方法? 代码段: 业务对象1: 业务对象2: 控制器: JPA实施学员DAO: persistence.xml 问题答案: 你现在可以使用JsonIgnoreProperties到属性(序列化过程中)的抑制序列,或忽略JSON性能的处理读取(反

  • 我使用Google Endpoint创建了一个应用服务器,它是一个即时消息应用程序的后端。每个用户都有一个好友列表。 当我创建一个新朋友时,我使用下面的方法将用户添加到彼此的朋友列表中。然而,由于循环依赖关系,当我添加朋友时,它给了我以下错误。 我看了贴出的其他问题和解决方案。他们中的大多数人结构不同,他们没有解决我的问题。 这个网站的一个答案是建议添加,但我没有任何字段可以添加。我试图放置,但我

  • 问题内容: 丈夫.java 妻子.java Service.java 当我使用spring数据jpa从数据库中查询丈夫时,结果发生无限递归,参见下图。使用@OneToOne注释时出了什么问题?有人可以给我一些建议吗?或者我以错误的方式使用了注释。 图片 问题答案: 这是一个已知问题,当您具有双向关系时,杰克逊将尝试从另一侧序列化一侧的每个引用,以便逻辑上具有无限递归。 解决方案:有很多解决方案,可