当应用程序基于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());
}
任何建议,如何让实体的图形时,应用程序在春季启动运行工作?
那么,什么是问题?这里是NamedEntityGraph的文档,https://docs.oracle.com/javaee/7/tutorial/persistence-entitygraphs002.htm –
问题是如何获取实体图工作,以及为什么在Spring上应用引导忽视它们。 –
我想,这可能是有帮助的:http://stackoverflow.com/questions/26291143/spring-data-jpa-jpaspecificationexecutor-entitygraph –