当前位置: 首页 > 知识库问答 >
问题:

惰性加载在Spring数据jpa中不起作用

姬向明
2023-03-14

我正在使用Springjpa和龙目岛来定义爪哇豆主题。每个主题都会有很多评论。我的一吨配置是

@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<>();

我创建的restful api是这样的。序列化似乎是问题所在,它总是获取注释。正如Chris所说,我添加了@JsonIgnore,它似乎解决了问题。但是如果我想加载注释怎么办,@JsonIgnore不会返回序列化中的注释。

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

共有1个答案

东龙野
2023-03-14

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

相反,您应该使用DTO类声明要从数据库中提取的数据,或者更好的是使用接口来说明要显示的内容。

请参阅下面的存储库(由于您也没有显示服务部分,因此我省略了它):

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:选择注释0_。topic_id作为topic_id3_0_0_,注释0_。id为id1_0_0_,注释0_。id为id1_0_1_,注释0_。文本为text2_0_1_,注释为0_。topic_id作为topic_id3_0_1_来自评论评论0_其中评论0_。主题id=
。。。

找到的每个主题。然后投影endpoint可以如下所示:

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

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

Hibernate:选择主题0_。id为col_0_0_,topic0_。topic_name为col _ 1 _ 0 _ from topic 0 _ order by topic 0 _。topic_name desc

 类似资料:
  • 我谷歌了很多,这是真的奇怪的Spring Boot(最新版本)可能没有懒惰加载是不工作的。以下是我的代码片段: 我的资源: 我的服务: 编辑2: 对于规范构建,我有:

  • 我正在使用JPA2.1(Eclipselink2.5.1)和JBoss7.1。 为什么不工作是懒惰加载? 谢谢

  • 这组订单应该是惰性加载的,但我得到以下异常:org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是org.hibernate.lazyInitializationException:未能懒洋洋地初始化Role:...,没有会话或会话被关闭 根本原因:org.hibernate.lazyInitializationExcept

  • 我们有许多通过接口扩展JpaRepository模式定义的存储库。当运行集成测试或应用程序的某些入口点时,我们只需要这些存储库的一个非常小的子集。 我们可以懒洋洋地加载实际的存储库隐含吗? 相当于@懒在@豆上的东西?注意:我至少尝试了用@lazy注释存储库接口的简单解决方案,但没有成功。

  • 我还有以下两个类,它们是由我的测试模型生成的: 在DBContext的构造函数中,我显式启用了延迟加载,甚至不需要: 后来我打电话给房子列表: 在标记的断点之后,我预期,由于延迟加载,与房屋相关联的所有人员此时都不会加载。我没有访问一个人,为什么要加载他们?但是它们被加载,因为我的调试器向我显示了所有的name属性。 有人能解释一下这种行为吗?为什么惰性加载不起作用?

  • 我使用的是spring-data-jpa。我写了一个本机查询,但它不起作用。这是我的实体类: 以下是查询: 起初,当我没有编写nativeQuery=true时,应用程序没有构建,我得到了一个异常“加入jpa的预期路径”。当我设置nativeQuery=true时,应用程序已启动,但当我调用该函数时,我收到以下错误: 是否有任何其他设置或注释可以解决此问题?我在谷歌上搜索过,但在所有情况下都有两个