Minha gente, estou com um problema muito cabeludo envolvendo JPA.
Estamos trabalhando com uma base “legada” (que a equipe de DBAs criou e nós desenvolvedores não podemos mexer) criando uma aplicação usando JPA no framework JBoss Seam. Porém, aparentemente os DBAs quiseram mostrar serviço e “tirar onda”, então resolveram inventar uma complexidade absurda em algumas tabelas importantes…
Basicamente, preciso mapear uma herança, onde a classe filha possui uma chave primária composta usando dois campos que também são chaves estrangeiras para campos na classe pai.
A classe pai é algo mais ou menos assim:
[code]public class Produto { // da tabela “produto”
private int idProduto;
private String nome;
private List<ProdutoVersao> versao;
// getters e setters...
}[/code]
E a classe ProdutoVersao, onde um Produto pode ter muitas versões:
[code]public class ProdutoVersao { // da tabela “produto_versao”
private int idProduto; // é uma CHAVE ESTRANGEIRA para a tabela produto
private Date dataDeCadastro;
private String gerenteResponsavel;
private String setor;
// getters e setters...
}[/code]
A classe filha seria algo assim:
[code]public class Livro extends Produto { // da tabela “livro”
private IdLivro id; // uma classe "embedded" por ser chave composta
private String autor;
private String isbn;
// getters e setters...
}[/code]
O grande problema é justamente nessa chave primária composta, representada pela classe IdLivro, porque seus dois únicos atributos, um inteiro e uma data, deveriam ser chaves estrangeiras para os dois atributos de mesmo nome da classe ProdutoVersao!!
[code]public class IdLivro { // não representa nenhuma tabela diretamente
private int idProduto; // chave estrangeira para a tabela produto_versao
private Date dataDeCadastro; // chave estrangeira para a tabela produto_versao
// getters e setters...
}[/code]
Não faço a menor idéia de como mapear essa salada para JPA. Porque o lance é que, quando eu persistir uma instância de Livro, o sistema deverá automaticamente preencher as tabelas produto, livro e produto_versao com os cados cadastrados, inclusive mantendo o mesmo número de id para as três classes.
Alguém pode me ajudar?