Java Spring Boot无法使用findAll或findByColumnName方法获取关系实体

Java Spring Boot无法使用findAll或findByColumnName方法获取关系实体,java,spring,spring-boot,spring-data-jpa,spring-data,Java,Spring,Spring Boot,Spring Data Jpa,Spring Data,我只是想测试SpringBootSpringDataJPAN中的@manytone关系,所以我创建了两个简单的类书和作者 这是教材和作者: @Entity @Table(name = "book") public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @Column(name = "title") private St

我只是想测试SpringBootSpringDataJPAN中的@manytone关系,所以我创建了两个简单的类书和作者

这是教材和作者:

@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时:

@RestController
public class BookRestController {

@Autowired
BookRepository bookRepo;

@RequestMapping("/books1/")
public List<Book> createInvoice() {
    List<Book> list = bookRepo.findAll();
    System.out.println(list);
    return list;
}
我也尝试过按标题搜索FindBytleteString,但也找不到作者

我发现的另一个例子是关于第二种关系@OneToMany,而不是相反


我必须在我的实体、存储库或控制器中添加什么才能以一种好的方式检索作者id?

我认为如果没有JsonIgnore,你可能会直接进入递归地狱,因为这本书有一个作者,而作者最少有这本书,而这本书有作者

试试AuthorId上的getter,比如

 public Long getAuthorId() {
    return (author == null) ? null : author.getId());
}
编辑:


在你的评论之前写下了maybe,现在我很确定:-

我认为如果没有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 {
  ...
}
删除@JsonIgnore并在这两个类上使用@JsonIdentityInfo来获得每本书的作者

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id")
public class Book {
  ...
}

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id")
public class Author {
  ...
}


嗯,如果你错过了作者,那么你打算用@JsonIgnore来处理JsonIgnore吗?作为回应,你忽略了作者。我添加了@JsonIgnore,因为当我删除它时,igot 404 not found:{时间戳:2020-06-06T13:54:46.510+00:00,状态:404,错误:not found,消息:,路径:/api/books/}我认为这是不相关的,找不到路径,可能是因为您在controller not/books/中使用了/books1/您的路径是books1hm,如果您错过了作者,那么您使用@JsonIgnore对JsonIgnoreBy的意图是什么?作为响应,您忽略了作者。我添加了@JsonIgnore,因为当我删除它时,igot 404未找到:{时间戳:2020-06-06T13:54:46.510+00:00,状态:404,错误:未找到,消息:,路径:/api/books/}这是无关的,我想,路径没有找到,可能是因为你在controller not/books/中使用了/books1/你的路径是books1当我添加这个时,我在日志中得到了相同的错误无限次,并且我得到了无限递归的结果:{id:1,title:Book1,author:{id:1,全名:费卡尔,书籍:[{id:2,标题:书籍2,作者:{id:1,全名:费卡尔,书籍:[author上的JsonIgnore返回原位?非常感谢,我再次添加了@JsonIgnore,它可以正常工作。当我添加此项时,我在日志中无限次出现相同的错误,并且我通过无限递归得到了结果:{id:1,title:Book1,author:{id:1,全名:费卡尔,书籍:[{id:2,标题:书籍2,作者:{id:1,全名:费卡尔,书籍:[author上的JsonIgnore返回原位?非常感谢,我再次添加了@JsonIgnore,它可以正常工作。我得到了这个错误:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:没有为org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor类找到序列化程序,也没有发现创建BeanSerializer的属性以避免异常,通过引用链在空bean上禁用SerializationFeature.FAIL\:java.util.ArrayList[0]->com.faycal.relation.entity.Book[author]->com.faycal.relation.entity.author$HibernateProxy$GdSp65g5[HibernateLazInitializer]在com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from,您是否删除@JsonIgnore并使用@JsonIgnoreProperties{hibernateLazyInitializer,handler}由于您有延迟调用,我尝试了前面的解决方案,因此我也将执行此操作。我遇到以下错误:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:找不到类org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor的序列化程序,也找不到创建BeanSerializer的属性为避免异常,请禁用SerializationF通过引用链在空bean上运行eature.FAIL:java.util.ArrayList[0]->com.faycal.relation.entity.Book[author]->com.faycal.relation.entity.author$HibernateProxy$GdSp65g5[hibernateLazyInitializer]位于com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from您是否删除@JsonIgnore并使用@JsonIgnoreProperties{hibernateLazyInitializer,handler}既然您有惰性调用,我已经尝试了前面的解决方案,我也会这样做