2016-07-28 2 views
0

어플리케이션이 스프링 부트를 기반으로 할 때 정의 된 엔티티 그래프는 고려되지 않습니다. 반대로 JUnit 테스트 중에는 모든 것이 잘 작동합니다.스프링 데이터 JPA 엔티티 그래프가 스프링 부트와 함께 작동하지 않습니다.

도메인은 매우 간단합니다. 책과 그 카테고리 (많은 관계가 많음).
도서 분류 :

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

카테고리 클래스 : REST 제어기

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

용도 :

@RequestMapping("/books") 
@ResponseBody 
public List<Book> getBooksSummary() { 
    return bookJpaRepository.findAll(); 
} 
,369 생성 엔티티 그래프를 사용하는 방법에

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

private String name; 

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

JPA 저장소

봄 부팅 (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/spest-data-jpa-jpaspecificationexecutor-entitygraph –

답변

4

Rae Burawes (감사합니다!)가 지적한 것처럼이 동작에 대한 이유는 직렬화입니다.
우리가 이러한 주석을 사용할 수 있습니다 잭슨 시리얼로 데이터를 가져 오는을 처리하려면
- com.fasterxml.jackson.annotation.JsonIdentityInfo을 - com.fasterxml.jackson.annotation.JsonManagedReference 또는 com.fasterxml.jackson.annotation.JsonIgnore - - 클래스/필드
에 필드에 대한 자세한 정보는 this tutorial에서 찾을 수 있습니다

.

+0

이러한 주석이 포함 된 솔루션을 제자리에 게시 할 수 있습니까? –

관련 문제