2016-07-28 13 views
0

Определенный граф объекта не учитывается, когда приложение основано на Spring Boot. Напротив, все работает отлично во время тестов JUnit.Spring Data Графики объектов JPA не работают с Spring Boot

Домен довольно прост: книги и их категории (отношение многих ко многим). Класс
Книги:

@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 отображаются книги, но с их соответствующими категориями (и исключение выбрано из-за бесконечной рекурсии: книги -> категории -> книги -> категории ->. ..).

Тот же самый код в тесте (работает с SpringJUnit4ClassRunner) работает должным образом, и граф объектов правильно распознается. Например, код ниже не отображаются категории, потому что, как ожидается, есть ленивая инициализация:

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

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

Любые предложения, как получить объектные графики работы, когда приложение работает на Spring ботинке?

+0

Итак, в чем вопрос? Здесь находится документ NamedEntityGraph, https: //docs.oracle.com/javaee/7/tutorial/persistence-entitygraphs002.htm –

+0

Вопрос в том, как заставить диаграммы сущностей работать и почему приложение на Spring Boot игнорирует их. –

+0

Я думаю, что это может быть полезно: http://stackoverflow.com/questions/26291143/spring-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

Можете ли вы разместить свое решение с помощью этих аннотаций? –

Смежные вопросы