| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2007 09:15:38
|
fviana
JavaChild
![[Avatar]](/images/avatar/58f1e2bfc0c0c182f1afdab7cae02402.png)
Membro desde: 09/06/2005 09:19:51
Mensagens: 116
Offline
|
Máscaras com Hibernate
1 - Introdução
Em um projeto de migração, deparei-me com um problema comum, mas de difícil resolução (utilizando muita 'gambiarra'). Recebi um damp de um banco de dados com várias tabelas, uma delas, TB_ENDERECO, possuía uma coluna de CEP, porém esta era do tipo numérica no banco, mas deveria ser sempre visualizada com a máscara 99999-999.
Criei então um UserType do hibernate, responsável pela formatação da máscara ao recuperar e remoção da máscara ao gravar o valor.
2 - Construção do utilitário
O primeiro passo é construir o utilitário que irá adicionar e remover a máscara.
3 - O Tipo Formatador
Para criar um tipo de dados para o hibernate basta criar uma classe implementando a interface org.hibernate.usertype.UserType. Nela há métodos que lê e grava o valor diretamente do banco de dados, além de outros métodos auxiliares.
Para nosso formatador ficar bem reutilizável teremos que implementar outra interface, a org.hibernate.usertype.ParameterizedType, que indica pro Factory do hibernate que o type possue parâmetros que devem ser enviados para ele.
Neste formatador existe 3 parametros, a máscara, o classType (tipo a ser setado para gravação) e o type (tipo da coluna no banco).
Obs.: Observe que estou utilizando a api commons-beans para a conversão de tipos, que pode ser baixado no site da Apache.
4 - Utilização
Repare que o cep é do tipo string, mas no banco o tipo é numérico (2 representa o tipo NUMERIC - ver java.sql.Types), sendo registrado pelo parâmetro 'type', e no hibernate (na verdade no PreparedStatement) o tipo a ser instanciado e gravado é java.lang.Long, sendo registrado pelo parâmetro classType.
Sendo assim, ao recuperar um Endereço, a propriedade cep virá com a máscara, e ao salvar um Endereço, a coluna cep receberá um número.
5 - Conclusão
Este é um mero exemplo de utilização de UserType do hibernate. Em vários casos podemos utilizar este recurso para facilitar o desenvolvimento. Nesta mesma migração, criamos também um UserType para criar uma lista a partir de um campo varchar2 que armazena telefones no mesmo campo utilizando; como separador.
Então, é só...
|
|
|
 |
|
|
|
|
|
|