Inserir dados em uma entidade com relacionamento

Boa tarde galera, tudo certo?

Estou fazendo um estudo sobre o Hibernate e JPA, e me surgiu uma dúvida sobre inserir dados em uma tabela que possui relacionamento com outras. Vou resumir a minha dúvida em entidades pequenas, para assim ficar mais fácil o entendimento.

##Entidades Criadas

@Entity
@Table(name="Curso")
public class CursoEntity{
    @Id
    @Column(name="Nr_Curso")
    private int nrCurso;

    @Column(name="Ds_Curso")
    private String dsCurso;

    /*  ... Getters e Setters ...  */
}

@Entity
@Table(name="Aluno")
public class AlunoEntity{
    @Id 
    @Column(name="Nr_Aluno")
    private int nrAluno;

    @Column(name="Nm_Aluno")
    private String nmAluno;

    @OneToOne
    @Column(name="Nr_Curso")
    private CursoEntity cursoEntity;

    /*  ... Getters e Setters ...  */
}

Método POST

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public AlunoEntity save(AlunoEntity alunoEntity) {
    AlunoBusiness business = new AlunoBusiness();
    int id = business.save(alunoEntity);
    alunoEntity.setIdAluno(id);
    return alunoEntity;
}

##Método Save
public int save(AlunoEntity alunoEntity) {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = null;
Transaction tx = null;

    try {
        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        int id = (int) session.save(alunoEntity);
        tx.commit();
        return id;
    } catch (Exception ex) {
        ex.printStackTrace();
        tx.rollback();
        return 0;
    } finally {
        session.close();
    }
}

Json a ser inserido

[{
    "nrAluno":1,
    "nmAluno":"Aluno Teste",
    "cursoEntity":{
        "nrCurso": 1,
        "nmCurso": "Ciência da Computação"
    }
}]

Utilizando o Postman para fazer um insert utilizando o @POST, o retorno a qual recebo é "Can not deserialize instance of … out of START_ARRAY"
Neste caso, como trato a informação do cursoEntity para inserir os dados?
Desculpem-me caso a dúvida seja simples, tentei localizar algo que me ajudasse, porém, sem sucesso.

Grato pela atenção!
Atenciosamente,
Adonai Fabricio Nozella

Quando o objeto vem do banco de dados e sai do entity maneger ele fica em modo detach. Então antes de salvar o curso você precisa buscalo novamente

cursoEntity=session.find(cursoEntity.getId());
alunoEntity.setCurso(cursoEntity);

@adonainozella tudo bem? Cara, pelo que me parece o seu problema está no formato do objeto JSON que está sendo enviado no POST. O objeto esperado pelo método é um AlunoEntity mas você está enviando um array, dessa forma vai ser lançada uma exceção pela sua API de serialização/deserialização informando que não foi possível criar o objeto. Tente alterar o objeto para:
{ "nrAluno":1, "nmAluno":"Aluno Teste", "cursoEntity":{ "nrCurso": 1, "nmCurso": "Ciência da Computação" } }
se isso representar a entidade AlunoEntity.

Abraço.

1 curtida

@Krismorte, sobre seu retorno não consegui utilizar o session.find, porém, com o retorno do @Luan.Lucas e algumas pesquisas em sala de aula, consegui resolver meu problema.

Solução: Dentro do objeto nome do Curso, foi passado somente o ID do Curso e não a descrição do mesmo, sendo o código:

[{
    "nrAluno":1,
    "nmAluno":"Aluno Teste",
    "cursoEntity":{
        "nrCurso": 1
    }
}]

Grato pela atenção de vocês!
E vamos seguindo os estudos! haha :grinning:

1 curtida