2016-07-28 85 views
0

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

域很简单:书籍及其类别(多对多关系)。
Book类:

@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; 

Category类:

@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后,会显示书籍,但会显示其各自的类别(并且由于无限递归导致异常:书籍 - >类别 - >书籍 - >类别 - >。 ..)。

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

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

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

任何建议,如何让实体的图形时,应用程序在春季启动运行工作?

+0

那么,什么是问题?这里是NamedEntityGraph的文档,https://docs.oracle.com/javaee/7/tutorial/persistence-entitygraphs002.htm –

+0

问题是如何获取实体图工作,以及为什么在Spring上应用引导忽视它们。 –

+0

我想,这可能是有帮助的:http://stackoverflow.com/questions/26291143/spring-data-jpa-jpaspecificationexecutor-entitygraph –

回答

4

正如Rae Burawes在评论中指出的那样(谢谢!),这种行为的原因是序列化。
要由杰克逊串行处理数据的抓取,我们可以使用这些批注:
- com.fasterxml.jackson.annotation.JsonIdentityInfo - 阶级/场
- com.fasterxml.jackson.annotation.JsonManagedReferencecom.fasterxml.jackson.annotation.JsonIgnore - 实地

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

+0

您可以使用这些注释发布解决方案吗? –

相关问题