2015-10-15 55 views
0

我的控制器在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;  
+0

如果您調用第一個控制器,該帖子是否也包含在JSON中?如果是這樣,那麼郵政領域當然會充滿這些數據。由於持久化對象隨後存儲在實體管理器中,所以在調用findById方法時將返回此對象。 – dunni

+0

感謝您的答案,是的,它被添加,因爲它來自請求'postId'來填充關係。所以可以理解,也會返回'post'。但是,即使使用'return commentService.findById(persistedComment.getId());',爲什麼它會返回'post',因爲它只是使用持久化對象的'id'作爲另一個請求的地址它是否正確? – augustoccesar

+0

AFAIK如果您在實體管理器中擁有一個託管對象(您擁有該託管對象,因爲您已經在該方法中保留了該註釋),並且您通過ID檢索該對象,則將使用實體管理器中的對象,該對象仍包含帖子。 – dunni

回答

1

如果您調用第一個控制器,並且該帖子也包含在JSON中,那麼帖子字段當然會填充該數據。由於持久化對象然後作爲管理對象存儲在實體管理器中,因此當您調用findById方法(實體管理器或Hibernate會話用作第一級緩存)時,將返回此對象。

1

在你的第一個案例一個新的評論對象持久化和因爲沒有數據庫調用來加載這個對象。持久化的註釋對象 將按原樣返回.Hibernate將持久對象保存在第一級緩存(hibernate會話)中。