Ленивая нагрузка в спящем режиме - PullRequest
0 голосов
/ 20 мая 2019

Я не могу заставить работать Lazy Load в Spring.

@Entity
public class Livro {

    @JsonInclude(Include.NON_NULL)
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotEmpty(message = "Campo nome é obrigatorio")
    private String nome;

    @JsonInclude(Include.NON_NULL)
    @JsonFormat(pattern = "dd/mm/yyy")
    @NotNull(message = "Campo publicacao é obrigatorio")
    private Date publicacao;

    @JsonInclude(Include.NON_NULL)
    private String editora;

    @JsonInclude(Include.NON_NULL)
    private String resumo;

    @OneToMany( mappedBy = "livro", fetch = FetchType.LAZY )
    private List<Comentario> comentarios;

// Comentario.Java

@Entity
public class Comentario {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @JsonProperty("comentario")
    private String texto;

    private String usuario;

    @JsonFormat(pattern = "dd/mm/yyy")
    private Date data;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "LIVRO_ID")
    @JsonIgnore
    private Livro livro;

// LivrosRepository.java

package com.curso.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.curso.domain.Livro;

public interface LivrosRepository extends JpaRepository<Livro, Long> {

}

//ComentariosRepository.java

package com.curso.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.curso.domain.Comentario;

public interface ComentariosRepository extends JpaRepository<Comentario, Long> {



}

// LivrosService.java

@Service
public class LivrosService {

    @Autowired
    private LivrosRepository livrosRepository;

    @Autowired
    private ComentariosRepository comentariosRepository;

   // [...]

    public List<Livro> listar() {
        return livrosRepository.findAll();
    }
}

Когда я делаю запрос на перечисление книг, я ожидаю, что я перечисляю все данные вкниги, но без комментариев, так как я использую java annotation fetch = FetchType.LAZY, но у меня есть поведение, возвращающее все данные в книге.

[
    {
        "id": 4,
        "nome": "Teste2",
        "publicacao": "01/01/2018",
        "editora": "Polenta",
        "comentarios": [
            {
                "id": 1,
                "usuario": "tester",
                "data": "26/03/2019",
                "comentario": "Comentario 1"
            }
        ]
    }
]

1 Ответ

0 голосов
/ 20 мая 2019

Hibernate Session существует в методе с @Transactional.Передача сущности за пределы класса Service является плохой практикой, поскольку сеанс закрывается после выхода из вашего метода listar.С другой стороны, ваша сущность содержит отложенные инициализированные коллекции (List<Comentario> comentarios), которые нельзя извлечь после закрытия сессии.

Хорошей практикой является сопоставление сущности с транспортным объектом и возврат этих транспортных объектов из службы (ненеобработанные сущности).

Прежде всего вы должны обернуть ваш public List<Livro> listar() метод с @Transactional.Hibernate Session будет активен во время выполнения этого метода.Это означает, что вы можете тянуть ленивые инициализированные элементы в этом методе.Во-вторых, вы должны определить LivroDto class со всеми необходимыми полями и сопоставить вашу сущность Livro с этим POJO в этом методе, а затем вернуть LivroDro из сервиса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...