无法处理托管/返回引用“defaultReference”:返回引用类型 (java.util.List) 与托管类型不兼容 (ForumAnswerReplay)

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/44713849/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 08:18:32  来源:igfitidea点击:

Can not handle managed/back reference 'defaultReference': back reference type (java.util.List) not compatible with managed type (ForumAnswerReplay)

javaspringhibernatespring-mvc

提问by Umapathi

Forum Answer saving time facing issue.before i saved successfully using @JsonIgnore but now i removed @JsonIgnore annonation.and added @JsonBackReference and @JsonManagedReference.

论坛回答节省了面临问题的时间。在我使用@JsonIgnore 成功保存之前,但现在我删除了@JsonIgnore annonation。并添加了@JsonBackReference 和@JsonManagedReference。

Stack Trace

堆栈跟踪

java.lang.IllegalArgumentException: Can not handle managed/back reference 'defaultReference': back reference type (java.util.List) not compatible with managed type (com.tta.abcd.model.ForumAnswerReplay)
at com.fasterxml.Hymanson.databind.deser.BeanDeserializerBase._resolveManagedReferenceProperty(BeanDeserializerBase.java:790)
at com.fasterxml.Hymanson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:516)
at com.fasterxml.Hymanson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:296)
at com.fasterxml.Hymanson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.Hymanson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.Hymanson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:443)
at com.fasterxml.Hymanson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:196)
at com.fasterxml.Hymanson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:26)
at com.fasterxml.Hymanson.databind.DeserializationContext.handleSecondaryContextualization(DeserializationContext.java:681)
at com.fasterxml.Hymanson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:445)
at com.fasterxml.Hymanson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:967)

Forum.java

论坛.java

    @Entity
    @Table(name="Forum")
    public class Forum {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="forumId")
    private Long forumId;

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

    @Column(columnDefinition="varchar(1000)",name="discription")
    private String discription;

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

    @Fetch(value = FetchMode.SELECT)
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "forumId")
    @JsonIgnore
    private List<ForumAnswer> forumList;
    }

ForumAnswer.java

ForumAnswer.java

    @Entity
    @Table(name="ForumAnswer")
    public class ForumAnswer {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="forumAnswerId")
    private Long forumAnswerId;

    @ManyToOne
        @JoinColumn(name = "forumId",insertable=true, updatable=true,nullable=true)
    private Forum forum;

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

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

    @Fetch(value = FetchMode.SELECT)
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "forumAnswerId")
    @JsonBackReference
    private List<ForumAnswerReplay> forumAnswerReplayList;

    @Transient
    private List<ForumAnswerReplay> faqReplayList;
}

ForumAnswerReplay.java

ForumAnswerReplay.java

@Entity
@Table(name="ForumAnswerReplay")
public class ForumAnswerReplay {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="replayId")
    private Long replayId;

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

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


    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="forumAnswerId",insertable=true,updatable=true,nullable=true)
        @JsonManagedReference
    private ForumAnswer forumAnswer;

    @Transient
    private String message;
}

Controller Code:

控制器代码:

public ForumAnswer saveForumAns(@RequestBody ForumAnswer forumAns, BindingResult bindingResult, HttpSession session,
        HttpServletRequest request, HttpServletResponse response) {
    ForumAnswer forumDetails = forumService.saveForumAns(forumAns, bindingResult, session);
    if (forumDetails != null) {
        forumDetails.setMessage("success");
    }
    else {
        forumDetails.setMessage("failed");
    }
    return forumDetails;
}

DAO:

道:

public ForumAnswer saveForumAns(ForumAnswer forumAns, BindingResult bindingResult) {

    final Session session = getSession();
    try {
        session.beginTransaction();
        Query query = session.createQuery("UPDATE ForumAnswer set answer =:answer,"
                + "forumAnswerId =:forumAnswerId,farmerUuid =:farmerUuid, answerDate =:answerDate");
        query.setParameter("answer", forumAns.getAnswer());
        query.setParameter("forumAnswerId", forumAns.getForumAnswerId());
        query.setParameter("farmerUuid", forumAns.getFarmer());
        query.setParameter("answerDate", forumAns.getAnswerDate());
        session.merge(forumAns);
        session.getTransaction().commit();
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println("error while saving forum details" + e);
    } finally {
        session.close();
    }

    return forumAns;
}

回答by dhyanandra singh

I think you have misplaced @JsonManagedReference and @JsonBackReference.

我认为您放错了@JsonManagedReference 和@JsonBackReference。

@JsonManagedReference : its forward part of reference so it will apply on collection type.

@JsonManagedReference :它的前向部分引用,因此它将应用于集合类型。

@JsonBackReference: its back part of reference.

@JsonBackReference:参考的后面部分。

so your code must be like

所以你的代码必须像

  @JsonManagedReference 
     private List<ForumAnswerReplay> forumAnswerReplayList;

 @JsonBackReference
    private ForumAnswer forumAnswer;

you can also use @JsonIdentityInfoyou have to apply

你也可以使用@JsonIdentityInfo你必须申请

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, 
                  property  = "forumAnswerId", 
                  scope     = Long.class)
public class ForumAnswer {
}

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, 
                  property  = "replyId", 
                  scope     = Long.class)
public class ForumAnswerReplay {
}

回答by sweety

Remove @JsonManagedReference in ForumAnswer class.

删除 ForumAnswer 类中的 @JsonManagedReference。

ForumAnswer class:

论坛答案类:

@Fetch(value = FetchMode.SELECT)
    @OneToMany(cascade = CascadeType.ALL,fetch=FetchType.EAGER)
    @JoinColumn(name = "forumAnswerId")
    private List<ForumAnswerReplay> forumAnswerReplayList;

In ForumAnswerReplay:

ForumAnswerReplay 中:

@JsonBackReference
public ForumAnswer getForumAnswer() {
    return forumAnswer;
}

回答by shawon

Use @JsonBackReference for @OneToMany and @JsonManagedReference for @ManyToOne relation to allow Hymanson to better handle the relation.

对@OneToMany 使用@JsonBackReference,对@ManyToOne 关系使用@JsonManagedReference 以允许Hymanson 更好地处理关系。