首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate-JPA中的无限递归

Hibernate-JPA中的无限递归
EN

Stack Overflow用户
提问于 2020-03-13 22:22:36
回答 2查看 493关注 0票数 0

在错误下面,我得到了无限递归。

代码语言:javascript
复制
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"]]

下面是我的代码

代码语言:javascript
复制
    @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;

另一个类

代码语言:javascript
复制
    @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上获取此值时会出现此错误。

代码语言:javascript
复制
    @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;
        }
EN

回答 2

Stack Overflow用户

发布于 2020-03-13 23:15:42

当您拥有StackOverflowException实体的双向关系时,您将获得此JPA。当Jackson试图反序列化它时,它会跟随你的对象图,这个对象图永远不会结束,因为DMSGroupBeanDMSDocumentClass正在引用它自己。

考虑在关系的一个站点上使用@JsonIgnore,如下所示:

代码语言:javascript
复制
@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;

}
票数 0
EN

Stack Overflow用户

发布于 2020-03-14 00:56:02

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

代码语言:javascript
复制
 @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;

代码语言:javascript
复制
@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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60672179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档