提问者:小点点

spring boot无法使用findAll或findByColumnName方法获取关系实体


我只是试图测试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?


共2个答案

匿名用户

我认为如果没有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 {
  ...
}