У меня есть таблицы Авторы и книги (с таблицей 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);
Отображение/отношение объектов
Скрипт базы данных
Я был удивлен, что найти решение для этого, по моему мнению, стандартную ситуацию было непросто. Я нашел два способа решить эту проблему. Первая из них немного косвенна: создание запроса, возвращающего объект, без включения поля списка ManytoMany, как описано здесь: Spring JPA выбирает определенные столбцы. Второй путь более прямой, но выглядит довольно экзотично: используя аннотации JsonBackReference и JsonManagedReference, как здесь: keenformatics.blogspot.se/2013/08/
Вы можете попытаться отметить взаимосвязь Book → author/Author → book Lazy загружается, чтобы избежать ввода бесконечного цикла :)
@ManyToMany (выборка = LAZY)
Author