Olá galera, estou fazendo um mapeamento com hibernate annotations usando o id não como sendo um tipo primitivo, mas sim uma classe:
//=============
//classe mapeada
[color=blue]@Entity
public class Carro implements Serializable { @Id
PKLong pk = new PKLong();
private String marca;[/color]
//-----------------------
//classe que armazena o pk
[color=blue]public class PKLong implements Serializable { @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private long codigo;[/color]
//=============
no banco, quando eu faço a persistência de um Carro o campo id da tabela é uma string enorme, acredito que seja a clase PKLong serializada:
[color=blue]ac ed 00 05 73 72 00 0f 62 65 61 6e 73 2e 70 6b 2e 50 4b 4c 6f 6e 67 7b 6f f1 19 58 39 22 86 02 00 01 4a 00 06 63 6f 64 69 67 6f 78 70 00 00 00 00 00 00 00 00[/color]
a minha pergunta é a seguinte:
como o hibernate lida internamente com uma id que é um objeto?
Como eu posso estar recuperando essa classe? antes eu fazia isso por um número (1, 2, 3, …), mas e agora?
Pergunta: porque diabos um usuário iria querer buscar por um ID de carro (ainda mais um ID desses)?
Para mim parece mais razoável que ele busque pelo nome, modelo, cor, ou qualquer outro tipo de coisa mas não o ID. Idealmente isso nem deveria aparecer para o usuário.
E finalizando, usar um ID desse tipo para uma tabela de “carros” me parece totalmente inadequado.
Só acho necessário o uso de um objeto representando uma chave primária, quando se refere a uma chave composta, até porque o id do carro será 'codigo' que é um tipo primitivo, mais você deve ter seus motivos de querer utilizar essa classe que representa o id de carro, acho que a solução é a mesma de chave composta.
A classe Carro não é obrigada a implementar Serializable, só a classe PKLong;
Isso aqui: “PKLong pk = new PKLong()” tá estranho, vamos colocar “private PKLong pk”;
Substituir o annotation @Id por @EmbeddedId, na declaração do atributo pk na classe carro, indicando assim que a chave estará na classe PKLong;
Adicionar o annotation @Embeddable, na classe PKLong, indicando assim que a classe PKLong representará uma chave;
Retirar o annotation @Id do atributo código na classe PKLongn, pois isso está sendo feito no item 4;
Satisfazendo as observações descritas acima, o código ficaria assim:
//-----------------------
//classe mapeada
[color=blue]@Entity
public class Carro {
Hoje eu estou usando o banco de dados Derby, futuramente (depois que o programa for instalado) irei usar mySql, sei que ambos aceitam a estratégia IDENTITY como generator de primaryKey, porém se algum dia um banco não suportar eu terei que dar manutenção em todos os meus pojo/bean? Por esse motivo eu estou querendo tirar essa anotação para uma única classe, mas como fazer isso com anotações?
Já procurei na documentação do hibernate e não encontrei nada.
a alternativa acima foi uma das soluções que encontrei, mas estou com problemas. alguém conheçe outra.
quanto ao recuperar por id, recupero por ele por que é assim que o hibernate.session busca um registro no banco:
mas com essa anotação eu poderei ter mapeamento na superclasse e também na subclasse? pois minha intenção é colocar somente a anotação do id nessa superclasse.
@MappedSuperclass
public abstract class Carro {
@Id
private Long id;
...
}
@Entity
public class Fusca extends Carro {
// Demais campos específicos da classe
}