(springboot + hibernate + jparepository) Ошибка - нет сеанса, при попытке установить GET - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть этот проект SpringBoot, где одно свойство моей сущности является LAZY, но когда я пытаюсь получить таблицу, которая зависит от этой сущности (я просто пытаюсь использовать Postman), я продолжаю получать эту ошибку-

{
    "timestamp": 1545232817105,
    "status": 500,
    "error": "Internal Server Error",
    "message": "Could not write JSON: failed to lazily initialize a collection of role: br.com.quantus.fonumS3_api.model.GesUsuarios.fnmCampanhaOpesForFnmCampanhaOpeOperador, could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: br.com.quantus.fonumS3_api.model.GesUsuarios.fnmCampanhaOpesForFnmCampanhaOpeOperador, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->br.com.quantus.fonumS3_api.model.GesUsuarios[\"fnmCampanhaOpesForFnmCampanhaOpeOperador\"])",
    "path": "/FonumAPI/GesUsuarios"
}

Вот как я настраиваю свои модели, репозитории и ресурсы:

//MODEL
@Entity
@Table(name = "ges_usuarios_015", schema = "public", uniqueConstraints = @UniqueConstraint(columnNames = "login_015"))
public class GesUsuarios implements java.io.Serializable {

    private static final long serialVersionUID = 6598890791981509364L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "codigo_015", unique = true, nullable = false)
    private Integer codigo015;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "turno_015")
    private GerTurno gerTurno;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "tipo_015")
    private GerTipoUsuario gerTipoUsuario;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "status_015")
    private GerStatusUsuario gerStatusUsuario;
    ....


//REPOSITORY
import org.springframework.data.jpa.repository.JpaRepository;
import model.GesUsuarios;

public interface GesUsuariosRepository extends JpaRepository<GesUsuarios, Integer> {

}

//RESOURCE
@CrossOrigin("${origem-permitida}")
@RestController
public class GesUsuariosResource {

    @Autowired
    private GesUsuariosRepository gesUsuariosRepository;    

    @GetMapping("/GesUsuarios")
    public List<GesUsuarios> ListarGesUsuarios(){   
    return gesUsuariosRepository.findAll();
    }
    ....

Я не могу использовать EAGER, потому что у меня есть тонны данных в моей БД, поэтомустановится довольно медленнымС другой стороны, при использовании LAZY я продолжаю сталкиваться с этой проблемой.
Я полагаю, это потому, что jpa закрывает сессию, прежде чем обратиться к модели внешнего ключа.

Как мне избежать этой проблемы?

1 Ответ

0 голосов
/ 19 декабря 2018

В приведенном выше решении вы извлекаете модель и отправляете ее непосредственно как часть ответа.Во время этого процесса ваш ответ пытается получить доступ к этим полям, чтобы преобразовать его в формат для отправки (xml / json / text).

Что нужно сделать здесь, если вы хотите, чтобы эти поля были просто нулевыми, это создать репрезентативную модель, в которой вы сопоставляете поля сущностей с представлением и просто пропускаете лениво загруженные поля (новый запрос будет создан, если/ когда вы пытаетесь получить доступ к этим полям при отображении в представление).

Пружинное загрузочное представление - это просто POJO без дополнительных аннотаций JPA (как у вашей сущности), оно автоматически преобразуется в тип вашей конечной точки.-point производит.

В вашем коде, в частности, после того, как он будет создан, он будет выглядеть примерно так:

@GetMapping("/GesUsuarios")
    public List<GesUsuarios> ListarGesUsuarios(){
    List<GesUsuarios> usuariosModels = gesUsuariosRepository.findAll();
    List<UsuariosRepresentation> usuarios;

    for(GesUsuarios usuariosModel : usuarios) {
      UsuariosRepresentation usuario = new UsuariosRepresentation();

      usuario.setField1(usuariosModel.getField1());
      ... //Do not include the lazily loaded pieces here, unless  you specifically want them.

      usuarios.add(usuario);
    }

    return usuarios;
}

Наконец, я бы также посмотрел на возвращение Optionals из ваших репозиториев,они весьма полезны здесь.

Дополнительное чтение: Baeldung - Дополнительное

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