Разве плохо иметь рекурсивность в коде, но не в сериализации? - PullRequest
3 голосов
/ 03 марта 2020

У меня есть такая связь между двумя моделями: Formulario и Secao. На Formulario есть Secao, но он временный. Просто для целей управления кодом. У Secao есть Formulario, но у них есть отношение JPA: @ ManyToOne.

Чтобы создать «Secao», мне нужно создать один «Formulario» до, а затем установить «Formulario» в «Secao» (потому что после будучи сохраненным в базе данных, объект теперь имеет идентификатор).

Основная проблема в том, что теперь у меня есть какой-то "круговой" код. Formulario> Secao> Formulario> Secao (и go на). Как только я сериализую объект, он становится грязным из-за рекурсивности. Использование @JsonBackReference и @JsonManagedReference удалось исправить проблему сериализации, но у меня все еще есть объекты рекурсивные в памяти.

Это ужасная проблема?

(Эта модель / отношение не была создана мной, и я не могу ее переделать).

@Entity(name = "formularios")
@Where(clause = "deletado = 'false'")
public class Formulario extends EntidadeGenerica {

    ....
    @Transient
    @JsonManagedReference
    private List<Secao> secoes;

    @Transient
    private List<Dependencia> dependencias;

@Entity(name = "formulario_secoes")
@Where(clause = "deletado = 'false'")
public class Secao extends EntidadeGenerica {

    ....
    @Column(nullable = false)
    private Boolean visivelMobile;

    @Column(nullable = false, name = "ordem_exibicao")
    private Integer ordemExibicao;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "formulario_id")
    @JsonBackReference
    private Formulario formulario;

public Formulario save(@RequestBody Formulario objeto, HttpServletRequest request) {

    try {

        formularioRepository.save(objeto);
        List<Secao> novasSecoes = objeto.getSecoes();

        novasSecoes.stream().map(s -> {
            s.setFormulario(objeto);
            return secaoRepository.save(s);
        });

        return objeto;

    } catch (Exception e) {
        System.out.println(e.getMessage());
        return null;
    }

}
{
    "id": 52,
    "dataUltimaAtualizacao": "2020-03-02",
    "dataCadastro": "2020-02-28",
    "deletado": false,
    "cliente": 1,
    "modulo": 35,
    "nome": "TESTE123",
    "entidadeDestino": "teste123",
    "bancoDadosDestino": "palotina",
    "schemaDestino": "cadastro_tecnico_multifinalitario",
    "ordem": null,
    "formularioPaiId": null,
    "secoes": [
        {
            "id": null,
            "dataUltimaAtualizacao": null,
            "dataCadastro": "2020-02-28",
            "deletado": false,
            "nome": "Dados Morador",
            "visivelMobile": true,
            "ordemExibicao": 1,
            "campos": [
                {
                    "id": null,
                    "dataUltimaAtualizacao": null,
                    "dataCadastro": "2020-02-28",
                    "deletado": false,
                    "nome": "Nome",
                    "tipo": "TEXTO",
                    "ordemExibicao": 1,
                    "visivelMobile": true,
                    "abrirFormularioFilho": null,
                    "inativo": null,
                    "obrigatorio": true,
                    "secao": null,
                    "atributoDestino": "proprietario",
                    "dependencia": null,
                    "campoOpcaos": null
                }
            ]
        }
    ],
    "dependencias": null
}

enter image description here

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