2
respostas

Cadastro usando o entity manager

Tentei fazer o cadastro, porém utilizando o entity manager. A única coisa que mudei no código foi trocar a interface TopicoRepository para uma classe que instancia o entity manager e nela tem um método para salvar. Quando faço o post obtenho um erro.

A classe ficou assim:

@Repository
public class TopicoRepository  {



       public void salvar(Topico topico) {

           EntityManagerFactory emf = Persistence.createEntityManagerFactory("alura");
           EntityManager em = emf.createEntityManager();

           em.getTransaction().begin();

           em.persist(topico);

           em.getTransaction().commit();
       }

}

O erro que obtenho é o seguinte ao salvar: org.springframework.orm.jpa.JpaSystemException: Error accessing field [private java.lang.Long br.com.alura.forum.modelo.Topico.id] by reflection for persistent property [br.com.alura.forum.modelo.Topico#id] : br.com.alura.forum.modelo.Topico@177d02dd; nested exception is org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.lang.Long br.com.alura.forum.modelo.Topico.id] by reflection for persistent property [br.com.alura.forum.modelo.Topico#id]

2 respostas

Man, seria legal você postar como você codificou sua classe Topico.

Sugiro que você olhe se os atributos tem getter e setter e também se o mapeamento está todo correto, com as anotações certas (@Id, @ManyToOne).

Se estiver tudo como o instrutor falou, posta aí tua classe pra gente dar uma olhada. Abraço!

Maycon,

segue abaixo o código da minha classe tópico. Com o spring data jpa funciona normal. Só não funciona quando uso o Entity manager. Desconfio que possa ser algo relacionado a classe TopicoForm utilizada para o cadastro dos dados.

@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() {

    }

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

    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;
    }


}

Classe TopicoForm:

 public class TopicoForm {

    @NotNull @NotEmpty @Length(min = 5)
    private String titulo;
    @NotNull @NotEmpty @Length(min = 10)
    private String mensagem;
    @NotNull @NotEmpty 
    private String nomeCurso;

    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 String getNomeCurso() {
        return nomeCurso;
    }
    public void setNomeCurso(String nomeCurso) {
        this.nomeCurso = nomeCurso;
    }

    public Topico converter(CursoRepository cursoRepository) {
        Curso curso = cursoRepository.findByNome(nomeCurso);
        return new Topico(titulo, mensagem, curso);
    }
}

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