无法处理托管/返回引用“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
Can not handle managed/back reference 'defaultReference': back reference type (java.util.List) not compatible with managed type (ForumAnswerReplay)
提问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 @JsonIdentityInfo
you 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 更好地处理关系。