我只是试图测试Spring Boot(spring data jpa)n中的关系@manytonone,所以我创建了两个简单的类Book和Author
这是课堂用书和作者:
@Entity
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "title")
private String title;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "author_id", nullable = false)
@JsonIgnore
//@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
private Author author;
类作者:
@Entity
@Table(name = "author")
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "fullname")
private String fullame;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "author", fetch = FetchType.LAZY)
private Set<Book> books;
我只想当我尝试调用findAll()来获取author的书籍时,当我在默认情况下这样做时,我会得到没有author的结果:
"_embedded": {
"books": [
{
"title": "Book1",
"_links": {
"self": {
"href": "http://localhost:8080/api/books/1"
},
"book": {
"href": "http://localhost:8080/api/books/1"
}
}
},
或者当我直接在controller中写入方法findAll时:
@RestController
public class BookRestController {
@Autowired
BookRepository bookRepo;
@RequestMapping("/books1/")
public List<Book> createInvoice() {
List<Book> list = bookRepo.findAll();
System.out.println(list);
return list;
}
我得到这样的结果:
[
{
"id": 1,
"title": "Book1"
},
{
"id": 2,
"title": "Book2"
},
我也试过按标题findByTitle(字符串)搜索,我也没有得到作者
我找到的另一个例子是关于第二个关系@OneTomany,而不是相反
我必须在我的实体或存储库或控制器中添加什么来检索(用一种好的方式)作者ID?
我认为如果没有JsonIgnore,也许你就会进入递归地狱,因为这本书有作者,作者有这本书的最小值,而这本书有作者。。。
在AuthorId上尝试一个getter,比如
public Long getAuthorId() {
return (author == null) ? null : author.getId());
}
编辑:
在你的评论之前写了“也许”,现在我很确定:-)
删除@jsonIgnore
,并在两个类上使用@jsonIdentityInfo
来获取每本书的作者。
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id")
public class Book {
...
}
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id")
public class Author {
...
}