Pessoal, eu tenho uma estrutura de classes onde eu tenho uma super classe PojoBase que tem alguns campos como id, data de criacao, usuario de criacao, e tenho sub-classes como cliente que tem seus demais atributos como nome, endereço,… e Empresa com atributos como atividade, nome fantasia, …
Estas classes acima referenciadas são mapeadas para JPA.
No entanto, as tabelas de Cliente e Empresa possuem o nome da coluna do campo id no banco de dados diferentes, ou seja, em clientes, o atributo id no banco de dados representa a coluna ‘cod_cliente’, enquanto que o de empresa chama-se ‘cod_empresa’. Pois bem, o que eu fiz foi sobrescrever o metodo getId nas subclasses Cliente e Empresa com suas anotações proprias. No final das contas deu certo, pois dai o getId passou a referenciar a coluna propria de cada subClasse.
No entanto, minha forma de trabalho é fazer todo o mapeamento JPA nas classes e depois peço ao hibernate para criar meu esquema baseado no meu mapeamento. Dai aconteceu que foram criados no banco de dados o campo id e o campo cod_cliente na tabela Cliente, e em Empresa foi criada a coluna id e cod_empresa. Sendo que como em codigo eu sobrescrevi o metodo getId() nas subclasses, eu esperava que o campo id nao fosse criado em tais tabelas.
Enfim, o que eu percebi é que em uma tabela anotada com @Entity para JPA, quando vou gerar as tabelas via hibernate baseado no mapeamento, ele considera todos os campos da classe que possuem getters e setters e criar coluna pra eles na tabela, independente de eu te-lo mapeado com nome de coluna ou nao. Alguem sabe como faça para indicar que aquele atributo da Classe @Entity deve para ser desconsiderado na criação do esquema?
Onde exatamente vc colocu a anotação correspondente ao nome da coluna no BD ?
acima dos metos getters. Por exemplo:
Em BasePojo eu nao coloco mais anotação, mesmo lá tendo as seguintes declarações:
protected Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
E em Cliente eu nao redeclaro o atributo id, pois na superclasse já tem, mas dai eu redefino os gets e sets:
@Override
@Id
@SequenceGenerator(name = "id_seq", sequenceName = "seq_empresa", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq")
@Column(name = "cod_empresa", unique = true, nullable = false, insertable = true, updatable = true)
public Integer getId() {
return (Integer) this.id;
}
@Override
public void setId(Integer id) {
this.id = id;
}
Dai entao, ele cria no banco de dados, a coluna id e a coluna cod_empresa, mesmo eu NAO tendo definido em BasePojo que o atributo id é mapeado em alguma coluna no BD.
E quando vc inseri um registro a coluna cod_cliente é atualizada com um valor de chave primária ou a coluna ID que recebe o valor da sequence…
ta meio estranho …nunca passei por isso, mas provavelmente é alguam besteirinha…
É a coluna ‘cod_cliente’ que é atualizada.
Também nao achei nada mais que possa me ajudar.