Spring Data JPA实体图不适用于Spring Boot

时间:2016-07-28 14:52:26

标签: java spring spring-boot spring-data-jpa entitygraph

当应用程序基于Spring Boot时,不会考虑已定义的实体图。相反,在JUnit测试期间一切正常。

域名非常简单:书籍及其类别(多对多关系) 图书课程:

@Entity
@NamedEntityGraph(name = "Book.summary",
attributeNodes = { @NamedAttributeNode("book_id"), @NamedAttributeNode("title")})

public class Book {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long book_id;

private String title;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "BOOK_CATEGORY",
        joinColumns = @JoinColumn(name = "book_id", referencedColumnName = "book_id"),
        inverseJoinColumns = @JoinColumn(name = "category_id", referencedColumnName = "category_id"))
private List<Category> categories;

分类:

@Entity
public class Category {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long category_id;

private String name;

@ManyToMany(mappedBy = "categories")
private List<Book> books;

JPA存储库,其方法使用创建的实体图:

@Component
@Repository
public interface BookJpaRepository extends JpaRepository<Book, Long> {
@Override
@EntityGraph(value = "Book.summary", type = EntityGraph.EntityGraphType.FETCH)
List<Book> findAll(); }

REST控制器中的用法:

@RequestMapping("/books")
@ResponseBody
public List<Book> getBooksSummary() {
    return bookJpaRepository.findAll();
}

启动Spring Boot(mvn spring-boot:run)并导航到http://localhost:8080/books书籍后,会显示各自的类别(由于无限递归而抛出异常:books - &gt; categories - &gt;书籍 - &gt;类别 - &gt; ...)。

测试中的相同代码(使用SpringJUnit4ClassRunner运行)按预期工作,并且正确识别实体图。例如,下面的代码不显示类别,因为正如预期的那样,存在延迟初始化:

@Test
public void testEntityGraph() {
    List<Book> all = bookJpaRepository.findAll();

    System.out.println(all.get(0).getCategories());
}

如何在Spring Boot上运行应用程序时如何使实体图形工作?

1 个答案:

答案 0 :(得分:4)

正如Rae Burawes(谢谢!)在评论中指出的那样,这种行为的原因是序列化 为了处理Jackson序列化器获取数据,我们可以使用这些注释:
- com.fasterxml.jackson.annotation.JsonIdentityInfo - 关于课程/字段
- com.fasterxml.jackson.annotation.JsonManagedReferencecom.fasterxml.jackson.annotation.JsonIgnore - 字段

更多信息可在this tutorial中找到。