Buscar

v4.6. Mapeando a Primary Key

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

4.6. Mapeando a Primary Key
Como vimos nas últimas aulas, temos algumas possibilidades de mapeamento da Primary Key. Especialmente em como podemos gerar o valor para este ID.
Temos quatro estratégias de geração do valor da Primary Key, são elas: AUTO, TABLE, SEQUENCE e IDENTITY. Nem todas são suportadas por todos os banco de dados, você irá aprender a medida que for conhecendo e testando estas opções nos banco de dados que trabalhar.
Para o MySQL a forma mais comum de mapeamento é usando IDENTITY, pois irá usar o AUTO INCREMENTO. No Oracle SEQUENCE é uma estratégia bastante comum também.
Se você precisar mapear uma SEQUENCE, é necessário informar o nome dela no mapeamento, veja abaixo como ficaria o mapeamento.
@Id
@SequenceGenerator(name="gerador", sequenceName="NOME_SEQUENCE_NO_BANCO")
@GeneratedValue(generator="gerador", strategy=GenerationType.SEQUENCE)
private Long codigo;
Agora é hora de você fazer alguns testes e aprender o que o irá acontecer no banco de dados. Vamos utilizar a estratégia TABLE na entidade Fabricante.
* DICA: Delete suas tabelas a medida que ver a necessidade de se observar um comportamento novo no banco de dados.
Para isso a forma mais simples e o seu primeiro teste é mapear a Primary Key como abaixo. Você irá reparar que uma nova tabela foi criada no banco de dados com o nome padrão (Na versão que estou utilizando o nome foi hibernate_sequences).
@Id
@GeneratedValue(strategy=GenerationType.TABLE)
private Long codigo;
Salve um novo fabricante no sistema utilizando a interface web. Repare que o código foi gerado corretamente.
Agora consulte a tabela hibernate_sequences (select * from hibernate_sequences), repare que ela tem duas colunas - sequence_name e sequence_next_hi_value.
A primeira coluna é o nome da entidade, no nosso caso Fabricante. Perceba que se nós utilizarmos essa estratégia (TABLE) em outras entidades, o que irá acontecer é uma nova entrada para cada tabela mapeada dessa maneira.
Agora tem um segredo com esse mapeamento que nós iremos desvendá-lo agora. Salve mais 5 fabricantes utilizando sempre a interface web.
Se você consultar a tabela fabricante, verá que todos os códigos foram gerados corretamente. Agora faça uma consulta na hibernate_sequences.
Ficou confuso? Porque ainda está 1 no sequence_next_hi_value?
O segredo é que o Hibernate não irá toda vez no banco de dados buscar qual é o próximo valor, ele simplesmente faz uma alocação (pega uma determinada quantidade por vez).
Quer entender um pouco melhor, pare o Apache Tomcat dentro do eclipse e inicie novamente. ATENÇÃO: agora não apague nada no banco de dados, deixe ele como está.
Salve um novo fabricante. Pesquise e veja se ele foi inserido. Qual é o código gerado para ele?
O que!?!? 
Agora faça uma consulta na tabela hibernate_sequences. Ficou mais confuso ainda?
Vamos a explicação. O Hibernate irá fazer apenas uma consulta para essa tabela e irá alocar uma quantidade de códigos em memória. Quando esses códigos terminarem que ele volta no banco, mas não para saber qual é o próximo código, mas sim para saber qual é o próximo montante que ele tem que pegar. Vou explicar isso melhor agora.
Vamos alterar algumas propriedades deste mapeamento para deixá-lo mais customizado. Agora é uma boa hora de apagar as tabelas do schema locadora.
Veja o código abaixo.
@Id
@TableGenerator(name="fabricante_generator", table="GERADOR_CODIGO", pkColumnName="ENTIDADE", 
valueColumnName="ALOCACAO", allocationSize=5)
@GeneratedValue(generator="fabricante_generator", strategy=GenerationType.TABLE)
private Long codigo;
Com a anotação @TableGenerator eu consigo customizar esta tabela de códigos. Repare acima que além de trocar o nome da tabela e das colunas eu consigo dizer o tamanho da alocação.
Neste caso reduzi para 5, significando que ele fará alocações de 5 em 5. Faça agora vários testes. Insira 6 fabricantes. Pare o Tomcat, inicie novamente. Qual o valor do código gerado? Use sua imaginação, crie, delete, apague as tabelas, etc. O importante é se divertir e aprender.

Outros materiais

Materiais relacionados

Perguntas relacionadas

Perguntas Recentes