Problema ao atribuir uma classe filha como atributo de outra classe

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

Faltou o @JoinColumn:

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

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

Pode tirar isso, não precisa.


name = "idpessoa"

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

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.

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?


as tabelas de Aluguel e Professor respeitativamente.

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).

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

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.

1 curtida

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).

1 curtida