Boa tarde pessoal,
Estou com um problema para gerar o banco de dados de uma aplicação que estou fazendo usando JPA.
No meu exemplo eu tenho 3 classes: Pessoa, Professor e Disciplina. Professor herda de Pessoa e Disciplina está associado com professor em um relacionamento ManyToOne (Cada disciplina possui 1 único professor e um professor pode estar associado com N disciplinas)
Segue o código das classes usando as annotations do JPA.
Pessoa.java
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "pessoa")
@NamedQueries({
@NamedQuery(name = "Pessoa.findByNome", query = "SELECT p FROM Pessoa p WHERE p.nome = :nome"),
@NamedQuery(name = "Pessoa.findByIdade", query = "SELECT p FROM Pessoa p WHERE p.idade = :idade"),
@NamedQuery(name = "Pessoa.findByRg", query = "SELECT p FROM Pessoa p WHERE p.rg = :rg"),
@NamedQuery(name = "Pessoa.findByCpf", query = "SELECT p FROM Pessoa p WHERE p.cpf = :cpf"),
@NamedQuery(name = "Pessoa.findByTelefone", query = "SELECT p FROM Pessoa p WHERE p.telefone = :telefone"),
@NamedQuery(name = "Pessoa.findAll", query = "SELECT p FROM Pessoa p")})
public class Pessoa implements Serializable {
@Id
@Column(name = "CPF", nullable=false)
private String cpf;
@Basic(optional = false)
@Column(name = "NOME", nullable=false)
private String nome;
@Basic(optional = false)
@Column(name = "IDADE", nullable=false)
private int idade;
@Basic(optional = false)
@Column(name = "RG", nullable=false)
private String rg;
@Basic(optional = false)
@Column(name = "TELEFONE", nullable=true)
private String telefone;
.....
Professor.java
@Entity
@Table(name = "professor")
@NamedQueries({
@NamedQuery(name = "Professor.findByFormacao", query = "SELECT p FROM Professor p WHERE p.formacao = :formacao"),
@NamedQuery(name = "Professor.findByAreapesquisa", query = "SELECT p FROM Professor p WHERE p.areaPesquisa = :areaPesquisa"),
@NamedQuery(name = "Professor.findAll", query = "SELECT p FROM Professor p")})
public class Professor extends Pessoa {
@Basic(optional = false)
@Column(name = "FORMACAO", nullable=true)
private String formacao;
@Basic(optional = false)
@Column(name = "AREAPESQUISA", nullable=false)
private String areaPesquisa;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "professor")
private Collection<Disciplina> disciplinas;
...
Disciplina.java
@Entity
@Table(name = "disciplina")
@NamedQueries({
@NamedQuery(name = "Disciplina.findByQtdcreditos", query = "SELECT d FROM Disciplina d WHERE d.qtdCreditos = :qtdCreditos"),
@NamedQuery(name = "Disciplina.findByNome", query = "SELECT d FROM Disciplina d WHERE d.nome = :nome"),
@NamedQuery(name = "Disciplina.findByCodigo", query = "SELECT d FROM Disciplina d WHERE d.codigo = :codigo"),
@NamedQuery(name = "Disciplina.findByCurso", query = "SELECT d FROM Disciplina d WHERE d.curso = :curso"),
@NamedQuery(name = "Disciplina.findByProfessor", query = "SELECT d FROM Disciplina d WHERE d.professor = :professor"),
@NamedQuery(name = "Disciplina.findAll", query = "SELECT d FROM Disciplina d")})
public class Disciplina implements Serializable {
@Basic(optional = false)
@Column(name = "QTDCREDITOS", nullable=true)
private int qtdCreditos;
@Basic(optional = false)
@Column(name = "NOME", nullable=false)
private String nome;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CODIGO", nullable=false)
private int codigo;
@JoinColumn(name = "CURSO_ID", referencedColumnName = "CODIGO")
@ManyToOne
private Curso curso;
@JoinColumn(name = "PROFESSOR_ID", referencedColumnName = "CPF")
@ManyToOne(optional = false)
private Professor professor;
...
Meu objetivo é que através da API JPA o banco de dados seja gerado corretamente. Porém, quando eu mando gerar o banco de dados, na tabela disciplina é criada uma chave estrangeira PROFESSOR_ID apontando para o campo CPF da tabela Pessoa, mas na verdade, deveria apontar para o campo CPF da tabela Professor (que herda de pessoa)
Alguém sabe se estou fazendo algo errado ou se existe um jeito de eu conseguir fazer eu referenciar a tabela professor ao invés da tabela pessoa nessa geração?
Ps: Estou usando Eclipse com EclipseLink 2.1 (JPA2)
Obrigado desde já…