Как получить список членов сущностей, которые имеют отношения manyToMany с другими сущностями, сопоставленными с JPA?

0

У меня есть таблицы Авторы и книги (с таблицей join Authorsbooks) в базе данных. Я создал и инициировал таблицы с MySQL. Я также сделал (стандартное) сопоставление JPA с двумя объектами Авторы и книги, используя @manyToMany и @Jointable в одном объекте и mappedBy в другой и связал его с базой данных.

Когда я пытаюсь получить все члены сущности Authors с Java с методом findAll() он возвращает бесконечную последовательность: как первый член авторов со списком книг, в котором первая книга содержит список авторов, в которых содержится первая Книга, которые содержат список авторов и т.д., бесконечный. Как получить только авторов без полей listOfBooks (например, у меня есть это в таблице базы данных)?

@Entity

публичный класс Автор {

@Id
@GeneratedValue
@Column(name = "authorid")
private Integer authorid;

@Column(name = "authorname")
private String authorname;

@ManyToMany(fetch = FetchType.LAZY, mappedBy = "listOfAuthors")
private List<Book> listOfBooks = new ArrayList<Book>();
//getters and setters

@Entity

Публичный класс Книга {

@Id
@GeneratedValue
@Column(name = "bookid")
private Integer bookid;
@Column(name = "bookname")
private String bookname;

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "author2books", joinColumns = @JoinColumn(name = "bookid"),
        inverseJoinColumns = @JoinColumn(name = "authorid"))
private List<Author> listOfAuthors = new ArrayList<Author>();

//getters and setters

@RestController

@RequestMapping (value = "/rest/authors") public class AuthorResource {

@Autowired
AuthorsRepository authorsRepository;

@GetMapping(value = "/all")
public List<Author> getAll() {
    return authorsRepository.findAll();
}

}

CREATE TABLE author

(authorid INT AUTO_INCREMENT PRIMARY KEY, authorname VARCHAR (255) NOT NULL);

CREATE TABLE Book (bookid INT AUTO_INCREMENT PRIMARY KEY, имя книги VARCHAR (255) NOT NULL);

CREATE TABLE author2books (автор INT, bookid INT,

ПЕРВИЧНЫЙ КЛЮЧ (authorid, bookid), ИНОСТРАННЫЙ КЛЮЧ (автор) ССЫЛКИ Автор (автор), ИНОСТРАННЫЙ КЛЮЧ (bookid) ССЫЛКИ Книга (bookid));

- Создать значения автора INSERT INTO Author VALUES (authorid, 'Sven'); ВСТАВЬТЕ В АВТОРЕ VALUES (автор, "Питер");

- Создать Книжные значения INSERT INTO Book VALUES (bookid, 'Biology'); INSERT INTO Book VALUES (bookid, 'Chemistry');

- Создать значения author2books

INSERT INTO author2books VALUES (1, 2);

Изображение 174551

Изображение 174551

Отображение/отношение объектов

Скрипт базы данных

  • 0
    Возможно, вы захотите показать свое отображение, тогда мы сможем помочь вам определить ошибку.
  • 0
    вы, вероятно, запускаете ленивую загрузку после доступа к коллекции типа Author
Показать ещё 7 комментариев
Теги:
spring
spring-data-jpa

2 ответа

0

Я был удивлен, что найти решение для этого, по моему мнению, стандартную ситуацию было непросто. Я нашел два способа решить эту проблему. Первая из них немного косвенна: создание запроса, возвращающего объект, без включения поля списка ManytoMany, как описано здесь: Spring JPA выбирает определенные столбцы. Второй путь более прямой, но выглядит довольно экзотично: используя аннотации JsonBackReference и JsonManagedReference, как здесь: keenformatics.blogspot.se/2013/08/

0

Вы можете попытаться отметить взаимосвязь Book → author/Author → book Lazy загружается, чтобы избежать ввода бесконечного цикла :)

@ManyToMany (выборка = LAZY)

  • 0
    это, вероятно, избыточные отношения сущностей bcoz с участием коллекций по умолчанию загружаются
  • 0
    Да, ты прав. это способ по умолчанию, но это не помешает попробовать правильно? Его отображение, похоже, не является проблемой здесь в любом случае. Или, возможно, это ..
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню