Em um post anterior eu coloquei uma dúvida que eu estou tendo com uma base de dados “legada” e que preciso mapear com JPA. Na hora em que escrevi o tópico não estava muito claro para mim qual era de fato o cerne do problema. Depois de pesquisar um pouco e estudar o assunto, acho que consegui isolá-lo.
O lance é o seguinte: há duas tabelas no banco, que chamarei aqui de pai e filho. O modelo de negócios é tal que se considera que um filho É-UM pai, ou seja, ao se persistir as informações que no âmbito do negócio representa um filho, eu preciso preencher tanto a tabela filho quanto a tabela pai.
Em termos de OO, é claro que essa relação É-UM será representada pela herança, ou seja, a classe Filho “extends” a classe Pai. E faz sentido em termos de negócio, porque em vários momentos eu terei uma referência à um objeto da classe Filho que precisará acessar atributos da classe Pai.
Se eu fosse primeiro mapear os objetos e a partir deles criar as tabelas no banco, mole, seria mais ou menos isso aqui:
[code]@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Pai {
@Id
@SequenceGenerator(
name = "seqPai",
sequenceName = "seq_pai",
allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqPai")
private int idPai;
private String nome;
public int getIdPai() {
return idPai;
}
public void setIdPai(int idPai) {
this.idPai = idPai;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}[/code]
E na classe filho, também é mole:
[code]@Entity
public class Filho extends Pai {
private String gestor;
private double preco;
public String getGestor() {
return gestor;
}
public void setGestor(String gestor) {
this.gestor = gestor;
}
public double getPreco() {
return preco;
}
public void setPreco(double preco) {
this.preco = preco;
}
}[/code]
Simples. Por conta da estratégia de herança Joined, a JPA criaria a tabela filho com um campo id_pai que, além de chave primária, seria uma chave estrangeira para a tabela pai.
A questão é que como a base é “legada”, as tabelas já existem de antemão. O problema é que, nesse banco que já existe, a tabela filho tem uma chave primária composta, formada por um campo id_pai (chave estrangeira para a tabela pai) e pelo campo preco!
A questão é, como eu mapeio essa chave composta na classe Filho, já que quando se usa a estratégia de herança do JPA não se pode mapear um campo chave primária nas classes que herdam de outra?!