Problema ao atribuir uma classe filha como atributo de outra classe

10 respostas Resolvido
Surt_Cthugha

Ola, sou um pouco novo nessa parte e queria uma ajuda.
Estou tentando adicionar a classe “Professor” como um atributo á classe “Aluguel”. a classe “Professor” é filha da classe “Pessoa”.
Quando eu executo não há indicação de erro, mas por algum motivo os dados do professor não aparecem no banco de dados de “Aluguel” como se não estivessem sendo salvos.
Acredito que deve ser algum erro na anotação acima da variável “nomeDoProfessor”, não conseguir encontrar nada sobre isso, se alguém puder me ajudar agradeço.
segue abaixo a classe “Aluguel”.

@Entity
public class Aluguel {

    @Id
    @GeneratedValue
    private long registro;

    @OneToOne
    private Livro Livro;

    @OneToOne
    private Aluno nomeDoAluno;

    @OneToOne
    private Professor nomeDoProfessor;

    @Temporal(TemporalType.DATE)
    private Date diaDoAluguel;

    @Column(length = 10, nullable = true)
    private boolean status;

    public long getRegistro() {
        return registro;
    }

segue a classe “Professor”:

@Entity
@PrimaryKeyJoinColumn(name = "idPessoa")
public class Professor extends Pessoa{

    @Column(length = 7)
    private double salario;

    public Professor() {
        super();
    }

10 Respostas

Lucas_Camara

Faltou o @JoinColumn:

@OneToOne
@JoinColumn(name = "NOME_DA_COLUNA_FK")
private Professor nomeDoProfessor;
Surt_Cthugha

o código ficou assim:
@Entity
public class Aluguel {

@Id
@GeneratedValue
private long registro;
@OneToOne
private Livro Livro;
@OneToOne
private Aluno nomeDoAluno;
@OneToOne @JoinColumn(name = "idpessoa", referencedColumnName = "nomeDoProfessor")
private Professor nomeDoProfessor;
@Temporal(TemporalType.DATE)
private Date diaDoAluguel;
@Column(length = 10, nullable = true)
private boolean status;

public long getRegistro() {
    return registro;
}

Mas quando executei ocorreu o seguinte erro:
java.lang.ExceptionInInitializerError

Lucas_Camara

Pode tirar isso, não precisa.


name = "idpessoa"

O idpessoa é a coluna FK da tabela Professor na tabela Aluguel ?

Surt_Cthugha

Não, eu acabei me confundido, o FK de Professor em Aluguel deveria ser a variável que o representa em Aluguel, no casso nomeDoProfessor.
Eu corrigir o código:

@Entity

public class Aluguel {

@Id

@GeneratedValue

private long registro;

@OneToOne

private Livro Livro;

@OneToOne

private Aluno nomeDoAluno;

@OneToOne @JoinColumn(name = nomeDoProfessor)

private Professor nomeDoProfessor;

@Temporal(TemporalType.DATE)

private Date diaDoAluguel;

@Column(length = 10, nullable = true)

private boolean status;

Voltou a passar nos testes, mas não salvar os dados de Professor.
Quando não era uma classe filha, como por exemplo atribuir Endereço a Pessoa, eu fazia o código desse mesmo jeito e não dava esse tipo de erro.

Lucas_Camara

Então, nesse caso, ai sim vc tem que usar o referencedColumnName pois a coluna usada no join não é a PK da tabela Professor. Faça assim:

@OneToOne
@JoinColumn(name = "nomeDoProfessor", referencedColumnName = "colunaNomeProfessorNaTabelaProfessor")
private Professor nomeDoProfessor;

Fazer join com uma coluna que não seja ID é uma péssima prática. Geralmente só é usado para contornar algum problema mais grave (gambiarra msm). Como são as tabelas Aluguel e Professor?

Surt_Cthugha


as tabelas de Aluguel e Professor respeitativamente.

Lucas_Camara

Ah cara, nome do professor é um número (BigInt). Confundi pois pensei que era um texto (por conta de ser um nome).

Quando vc salva o aluguel, o atributo professor está atribuído no aluguel? Talvez esteja faltando o cascade no @OneToOne, assim: @OneToOne(cascade = CascadeType.PERSIST).

Surt_Cthugha

Eu atualizei o cogido, ainda não salva, mas agora estar indicando um erro.

javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.gemeos.escolacomtdd.model.Professor

Surt_Cthugha

Consegui. eu achei um tópico que falava sobre o erro que mencionei a chima. o código da classe “Aluguel” atualizado.

@Entity

public class Aluguel {

@Id

@GeneratedValue

private long registro;

@OneToOne

private Livro Livro;

@OneToOne

@JoinColumn(name = nomeDoAluno, referencedColumnName = idPessoa)

private Aluno nomeDoAluno;

@OneToOne

@JoinColumn(name = nomeDoProfessor, referencedColumnName = idPessoa)

private Professor nomeDoProfessor;

@Temporal(TemporalType.DATE)

private Date diaDoAluguel;

@Column(length = 10, nullable = true)

private boolean status;

Obrigado pela ajuda.

Lucas_Camara
Solucao aceita

Soh recomendo que tu mude o nome das colunas nomeDoAluno e nomeDoProfessor para algo mais indicativo, como: idAluno e idProfessor (mudar na tabela Aluguel apenas).

Criado 29 de abril de 2020
Ultima resposta 29 de abr. de 2020
Respostas 10
Participantes 2