4
respostas

FindById() não retorna @OneToMany

Possuo os seguintes mapeamentos das entidades Tela e Ação apresentados logo abaixo:

Tela

@Entity
@Data
@Table(uniqueConstraints = @UniqueConstraint(columnNames= {"nome"}, name="uk_tela"))
public class Tela {

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

    @NotNull
    private String nome;

    @NotNull
    @Convert(converter = AtivoEnumConverter.class)
    @Column(length = 1, nullable = false)
    private AtivoEnum ativo = AtivoEnum.SIM;

    @OneToMany(mappedBy = "tela") 
    @OnDelete(action = OnDeleteAction.CASCADE)
    private List<Acao> acoes;
}

Ação

@Entity
@Data
@Table(uniqueConstraints = @UniqueConstraint(columnNames= {"nome"}, name="uk_acao"))
public class Acao {

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

    @NotNull
    private String nome;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "idtela", nullable = false, foreignKey = @ForeignKey(name = "fk_tela_acao"))
    private Tela tela;
}

Ao criar o endpoint para listar utilizo o findAll() ou então pesquisarPorId que utilizo o findById() consigo obter a entidade por completo (Tela e Acoes), porem quando realizar o endpoint de alterar abaixo o mesmo não me retorno as ações.

Tentativa 1

    @Transactional
    public Tela alterar(TelaDto telaDto) {
        Tela tela = telaDto.toEntity();
        telaRepository.save(tela);

        Optional<Tela> retorno = telaRepository.findById(telaDto.getId());
        if(retorno.isPresent()) {
            return retorno.get();
        }
        return null;
    }

Tentativa 2

public interface TelaRepository extends JpaRepository<Tela, Integer>{

    @Query( " select t from Tela t"
          + " join fetch t.acoes a"
          + " where t.id = :id")
    Optional<Tela> pesquisarPorId(@Param(value = "id") Integer id);
}
    @Transactional
    public Tela alterar(TelaDto telaDto) {
        Tela tela = telaDto.toEntity();
        telaRepository.save(tela);

        Optional<Tela> retorno = telaRepository.pesquisarPorId(telaDto.getId());
        if(retorno.isPresent()) {
            return retorno.get();
        }
        return null;
    }

Alguém poderia me explicar o que esta errado ???

Em nenhuma das tentativas funcionou, mesmo eu passando o mapeamento para EAGER

4 respostas

Oi Thiano,

Tenta colocar:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "tela")

Já tentei assim e o mesmo erro persiste.

Também tentei deixar com cascade All e não resolveu.

E por fim tentei deixar tudo sem @transational e também não resolveu.

Não faço ideia o que possa esta errado, se é o mapeamento, ou a forma que estou fazendo o fluxo para alterar os dados no banco de dados, eu gostaria apenas de alterar os dados e retornar o as informações completas.

Se quiser baixar o projeto, ele está em um repositório no gitlab comk público

https://gitlab.com/thianolima/projeto.git

Alguém consegue me ajudar???

E ai pessoal !!!!! ninguém consegue dar um help??????

pelo visto a galera saiu pro carnaval por aqui =-(

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software