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

Erro no Postman

HHH000143: Bytecode enhancement failed because no public, protected or package-private default constructor was found for entity: br.com.alura.forum.modelo.Topico. Private constructors don't work with runtime proxies!; nested exception is org.hibernate.HibernateException: HHH000143: Bytecode enhancement failed because no public, protected or package-private default constructor was found for entity: br.com.alura.forum.modelo.Topico. Private constructors don't work with runtime proxies!

7 respostas

A mensagem está dizendo que não encontrou um construtor padrão para a classe Topico, ou seja, um construtor sem parâmetros. Pode ser vazio mesmo, mas precisa existir para o JPA construir as entities:

public Topico() {}

O próprio Java já cria um construtor padrão para todas as classes, mas somente se você não declarar um construtor com parâmetros... mas a solução é só acrescentar o construtor vazio como mostrado acima - uma classe pode ter quantos construtores você quiser, desde que tenham a assinatura (lista de parâmetros) diferentes.

package br.com.alura.forum.modelo;

import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List;

import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.OneToMany;

@Entity() public class Topico {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String titulo;
private String mensagem;
private LocalDateTime dataCriacao = LocalDateTime.now();
@Enumerated(EnumType.STRING)
private StatusTopico status = StatusTopico.NAO_RESPONDIDO;
@ManyToOne
private Usuario autor;
@ManyToOne
private Curso curso;
@OneToMany(mappedBy = "topico")
private List<Resposta> respostas = new ArrayList<>();

public Topico(String titulo, String mensagem, Curso curso) {
    this.titulo = titulo;
    this.mensagem = mensagem;
    this.curso = curso;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((id == null) ? 0 : id.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Topico other = (Topico) obj;
    if (id == null) {
        if (other.id != null)
            return false;
    } else if (!id.equals(other.id))
        return false;
    return true;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getTitulo() {
    return titulo;
}

public void setTitulo(String titulo) {
    this.titulo = titulo;
}

public String getMensagem() {
    return mensagem;
}

public void setMensagem(String mensagem) {
    this.mensagem = mensagem;
}

public LocalDateTime getDataCriacao() {
    return dataCriacao;
}

public void setDataCriacao(LocalDateTime dataCriacao) {
    this.dataCriacao = dataCriacao;
}

public StatusTopico getStatus() {
    return status;
}

public void setStatus(StatusTopico status) {
    this.status = status;
}

public Usuario getAutor() {
    return autor;
}

public void setAutor(Usuario autor) {
    this.autor = autor;
}

public Curso getCurso() {
    return curso;
}

public void setCurso(Curso curso) {
    this.curso = curso;
}

public List<Resposta> getRespostas() {
    return respostas;
}

public void setRespostas(List<Resposta> respostas) {
    this.respostas = respostas;
}

}

Oi Joao,

Como o Leonardo mencionou, sua classe Topico precisa de um construtor padrão(sem argumentos) pois isso é uma exigência da JPA. Na sua classe tem o construtor que recebe o titulo, mensagem e curso, e agora você deve definir também um construtor default.

Bons estudos!

Desculpe o incomodo mas onde tenho que colocar o construtor padrão? E tbm o construtor default

Na classe Topico:

public Topico() {
}

public Topico(String titulo, String mensagem, Curso curso) { this.titulo = titulo; this.mensagem = mensagem; this.curso = curso; vou substituir aqui

solução!

Você precisa deixar os dois construtores:

public Topico() {
}

public Topico(String titulo, String mensagem, Curso curso) {
    this.titulo = titulo;
    this.mensagem = mensagem;
    this.curso = curso;
}