我的控制器在Spring Boot上行爲不同,我不知道爲什麼。我有這樣的模式:保存後懶惰被忽略
@Entity
@Table(name = "comments")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private boolean anonymous = false;
@Column(nullable = false, length = 150)
private String text;
@Temporal(TemporalType.TIMESTAMP)
@Column(nullable = false)
private Date date;
@ManyToOne(fetch = FetchType.EAGER)
private User user;
@ManyToOne(fetch = FetchType.LAZY)
private Post post;
// Getters and Setters
}
在我控制我做的:
@RequestMapping(value = "",
method = RequestMethod.POST,
produces = MediaType.APPLICATION_JSON_VALUE)
public Object createComment(Comment comment, HttpServletRequest request){
comment.setUser(userService.findByUsername(UserUtil.readUsernameFromUrlToken(request)));
Comment persistedComment = commentService.save(comment);
if(persistedComment != null){
if(persistedComment.isAnonymous()){
persistedComment.setUser(null);
}
return persistedComment;
}
return new Error(Error.NOT_CREATED, "Comment not created!");
}
它返回一個annotaded懶的post
。但是,當我在另一個控制器讀取,它返回預期的結果(不懶post
)
@RequestMapping(value = "/{id}/comments",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
public Object findCommentsByPostId(@PathVariable("id") long postId){
List<Comment> comments = commentService.findByPostId(postId);
for(Comment comment : comments){
if(comment.isAnonymous()){
comment.setUser(null);
}
}
return comments;
}
在此請求映射,它僅返回user
,符合市場預期。 我不知道爲什麼在第一個將其與懶惰post
resturns,就算我做的:
return commentService.findById(persistedComment.getId());
,而不是
return persistedComment;
如果您調用第一個控制器,該帖子是否也包含在JSON中?如果是這樣,那麼郵政領域當然會充滿這些數據。由於持久化對象隨後存儲在實體管理器中,所以在調用findById方法時將返回此對象。 – dunni
感謝您的答案,是的,它被添加,因爲它來自請求'postId'來填充關係。所以可以理解,也會返回'post'。但是,即使使用'return commentService.findById(persistedComment.getId());',爲什麼它會返回'post',因爲它只是使用持久化對象的'id'作爲另一個請求的地址它是否正確? – augustoccesar
AFAIK如果您在實體管理器中擁有一個託管對象(您擁有該託管對象,因爲您已經在該方法中保留了該註釋),並且您通過ID檢索該對象,則將使用實體管理器中的對象,該對象仍包含帖子。 – dunni