Baixe o app para aproveitar ainda mais
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.
Compartilhar