【发布时间】:2019-10-04 19:38:44
【问题描述】:
我想使用 spring jpa 和 hibernate 创建一个简单的多对多关系,代码如下:
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = "name")
private String name;
@ManyToMany(cascade = CascadeType.ALL,
fetch = FetchType.LAZY)
@JoinTable(name = "book_publisher",
joinColumns = @JoinColumn(name = "book_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "publisher_id", referencedColumnName = "id"))
private Set<Publisher> publishers;
和
@Entity
public class Publisher {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
@ManyToMany(mappedBy = "publishers"
, fetch = FetchType.LAZY)
@Nullable
private Set<Book> books = new HashSet<>();
public Publisher(String name) {
this.name = name;
}
如上图所示,所有集合都是惰性获取的。
我创建了两个实体的两个存储库:
public interface PublisherRepository extends JpaRepository<Publisher, Integer>{
}
public interface BookRepository extends JpaRepository<Book, Integer>{
}
我创建了一个简单的控制器:
@GetMapping("/getPublisher/{id}")
public Publisher getPublisher(@PathVariable Integer id) {
return publisherRepository.findById(id).get();
}
发生了一些奇怪的事情:
当我通过 curl 进行 http 调用时,我收到了这样的响应:
{"id":1,"name":"YanYan","books":[{"id":1,"name":"复仇者联盟","publishers":[{"id":1, "name":"YanYan","books":[{"id":1,"name":"复仇者联盟","publishers":[{"id":1,"name":"YanYan","books ":[{"id":1,"name":"复仇者联盟","publishers":[{"id":1,"name":"YanYan","books":[{"id":1, "name":"复仇者联盟","publishers":[{"id":1,"name":"YanYan","books":[{"id":1,"name":"复仇者联盟","publishers ":[{"id" .....
这表示它们都没有被延迟获取,这会导致无限循环。
谁能告诉我为什么?
【问题讨论】: