Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Como posso acessar dados de uma classe filha pelo th:value do Thymeleaf?

Criei uma aplicação web em que é possível cadastrar Pessoa Física ou Pessoa Jurídica por um formulário, e as pessoas cadastradas são exibidas numa tabela. Para isso, fiz a classe ClientePessoaFisica e ClientePessoaJuridica extenderem da classe Cliente:

class Cliente:

@Entity
@Table(name = "clientes")
@Inheritance(strategy = InheritanceType.JOINED)
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Cliente {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String email;
    private String telefone;
    private String tipoCliente;

    @Embedded
    private Endereco endereco;
    

class ClientePessoaFisica:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class ClientePessoaFisica extends Cliente {
    private String nome;
    private String cpf;
}

class ClientePessoaJuridica:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class ClientePessoaJuridica extends Cliente {

    private String razaoSocial;
    private String nomeFantasia;
    private String cnpj;
}

ClienteRepository:

public interface ClienteRepository extends JpaRepository<Cliente, Long> {
}

Construtor:

   @GetMapping("/atualizaPessoaFisica")
    public String atualizaPessoaFisica(Long id, Model model) {
        var cliente = repository.getReferenceById(id);
        model.addAttribute("cliente", cliente);
        return "clientes/atualizaPessoaFisica";
    }

Ambos os tipos são salvos no ClienteRepository e estão sendo exibidos corretamente na lista, porém ao tentar acessar dados de um id específico pelo repository.getReferenceById(id) usando, por exemplo, th:value="${cliente.nome}" é exibido um erro, pois é recuperado o id da tabela clientes onde nome é nulo:

Uma exemplo de tabela mysql usando o HeidiSQL Como posso fazer para acessar o atributo nome na tabela cliente_pessoa_fisica através do Repository? Eu estou trabalhando com a herança da maneira correta? Agradeço desde já.

2 respostas
solução!

Olá, Henrique!

Primeiramente, é importante verificar se a estrutura de herança está correta. Pelo código que você compartilhou, parece que está tudo certo. A classe Cliente é a classe pai, e as classes ClientePessoaFisica e ClientePessoaJuridica são as classes filhas que estendem a classe Cliente. Essa é uma forma válida de implementar herança no JPA.

Agora, em relação ao erro que você está enfrentando ao tentar acessar o atributo "nome" através do th:value="${cliente.nome}", é importante entender que o método getReferenceById retorna uma referência para a entidade, e não os dados completos. Por isso, ao tentar acessar o atributo "nome", ele está retornando nulo.

Para resolver esse problema, você pode utilizar o método findById do ClienteRepository, que retorna a entidade completa ao invés de apenas uma referência. Dessa forma, você terá acesso aos atributos corretamente. Por exemplo:

@GetMapping("/atualizaPessoaFisica")
public String atualizaPessoaFisica(Long id, Model model) {
    var cliente = repository.findById(id).orElse(null);
    model.addAttribute("cliente", cliente);
    return "clientes/atualizaPessoaFisica";
}

Dessa forma, o objeto "cliente" terá todos os atributos preenchidos, incluindo o "nome", e você poderá acessá-lo corretamente no Thymeleaf usando th:value="${cliente.nome}".

Espero ter ajudado! Bons estudos!

Cara, muito obrigado! Ajudou demais!