Mapeando herança - pai com chave primária comum, filho com chave composta

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?!

Olá Amigo, tenta isso aqui;

@Entity
@Table(name = "tabela, schema = “esquema”)
@PrimaryKeyJoinColumn(name = “campo pai em filho”)
public class Filho {

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

}

Obrigado, Ramundodavy, mas pelo que eu entendi essa anotação serve apenas para mapear uma coluna da tabela “filha” que é a chave primária/estrangeira para a tabela “pai”, caso o nome dessa coluna não seja o mesmo da coluna na tabela “pai”.

O problema é que na classe filha o nome da coluna é até o mesmo da coluna na classe pai, porém não é a única chave primária. Ela é um dos campos de uma chave composta, junto com, no caso desse exemplo, o campo “preco”.

Meu problema é justamente esse, dizer pro Hibernate/JPA que, na tabela filho, o campo “id_pai” é UM DOS campos da sua chave primária composta…