延迟加载在 Spring 数据 jpa 中不起作用

lazy load does not work in Spring data jpa

我正在使用 spring jpa 和 lombok 来定义 java bean 主题。每个主题都会有很多评论。我的onetomany配置是

@Entity
@Table(name = "TOPIC")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Topic implements Serializable {

@OneToMany(
            fetch = FetchType.LAZY, 
            cascade = CascadeType.REMOVE,
            mappedBy = "topic"
        )
    private Set<Comment> comments= new HashSet<>();

我创建的restfulapi是这样的。序列化似乎是问题所在,它总是获取评论。正如 Chris 所提到的,我添加了 @JsonIgnore,这似乎解决了问题。但是如果我要加载评论怎么办,@JsonIgnore不会return连载中的评论。

@GetMapping("/topics")
   public List<Topic> getAllTopics(@SortDefault(sort = "topicName", direction = DESC) Sort sort) {
      return topicService.getAllTopics(sort);
   }

我相信你真正需要的是一个投影。延迟获取不是可以在运行时轻松配置的东西,更不用说防止加载延迟项了。

相反,您应该使用 DTO class 或使用 interface[= 更好地声明要从数据库中获取的数据34=] 告诉要显示什么。

见下面的存储库(我省略了 service 部分,因为你也没有显示它):

public interface TopicRepository extends PagingAndSortingRepository<Topic, Long> {  
    List<Topic> findAll(Sort sort);

    // bean convention getter declarations for fields to fetch
    interface TopicWithoutComments {
        Long getId();
        String getTopicName();
    }

    List<TopicWithoutComments> findAllBy(Sort sort);
}

现在yiu需要单独的方法(或者其他任何你想决定是否显示评论的方法),首先是原文:

@GetMapping("/topics")
public List<Topic> getAllTopics(@SortDefault(sort = "topicName", 
        direction = Direction.DESC) Sort sort) {
    return topicRepository.findAll(sort);
}

它输出如下内容:

Hibernate: select comments0_.topic_id as topic_id3_0_0_, comments0_.id as id1_0_0_, comments0_.id as id1_0_1_, comments0_.text as text2_0_1_, comments0_.topic_id as topic_id3_0_1_ from comment comments0_ where comments0_.topic_id=?
...

对于找到的每个主题。那么投影端点可能是这样的:

@GetMapping("/topics/wocomments")
public List<TopicWithoutComments> getAllTopicsWithoutComments(
        @SortDefault(sort = "topicName",
            direction = Direction.DESC) Sort sort) {
    return topicRepository.findAllBy(sort);
}

这将只打印一行(假设主题上没有其他一对多关系):

Hibernate: select topic0_.id as col_0_0_, topic0_.topic_name as col_1_0_ from topic topic0_ order by topic0_.topic_name desc