@sanek_gyy

Как работает LAZY/EAGER загрузка на практике?

Имею следующий код: две сущности со связью 1 ко многим ( library и book),
@Entity
@Table(name = "book")
//@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Book implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private  long id;

    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "library_id")
    @JsonBackReference
    private Library library;

// constructor, getter and setter


import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

@Entity
//@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Library implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String name;

    @OneToMany(mappedBy = "library", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JsonManagedReference
    private List<Book> books;

// constructor, getter and setter


простой repository

и контроллер
@RestController
public class BookController {
    @Autowired
    BookRepository bookRepository;

    @GetMapping("/allbook")
    private Iterable<Book> getAllBook() {
        return bookRepository.findAll();
    }

    @GetMapping("/bookbyid")
    private Book getBookById() {
        Book book = bookRepository.findById((long) 1).get();
        return book; }

    @GetMapping("librarybybook")
    private Library getLibraryByBook() {
        Library library = bookRepository.findById((long) 1).get().getLibrary();
        return library;
    }
}

Вопрос 1) Выводя на экран все книжки, я ожидал увидеть Id, name и library_id. Но в итоге я получаю только Id и name. Так происходит при любой загрузке LAZY/EAGER. Почему?
Вопрос 2) При LAZY загрузке, пробуя получить library к которой принадлежит book, мне выдает ошибку com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer...
а на экран выводится следующее
<html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p><div id='created'>Wed Oct 24 19:14:12 MSK 2018</div><div>There was an unexpected error (type=Internal Server Error, status=500).</div><div>Type definition error: [simple type, class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.netcraker.entity.Library_$$_jvst22e_0[&quot;handler&quot;])</div></body></html>


Но если установить (fetch = FetchType.EAGER), то выводит library в месте с book связанные с ней.
Тоже не могу понять почему
  • Вопрос задан
  • 1579 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽