延迟加载在 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
我正在使用 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