mai 21

Loading gifs

Dica rápida para quem trabalha com ajax e não sabe criar ou manipular imagens e não quer perder tempo caçando imagens prontas na internet.

Quando queremos bloquear a tela e mostrar que estamos executando um processamento ajax que demora alguns segundos ou até minutos,é interessante colocar uma imagem animada que indique ao usuário que algo está sendo executado. Para criar esses gifs eu encontrei nas internets um site bem legal : http://preloaders.net/ .

Nele você tem uma lista de gifs( não são muitos, mas já ajuda), e aí você pode personalizar cor, velocidade, frames, dentre outras características do gif e criar na mesma hora do jeito que você quiser!

mai 06

Jquery com JSF

Quem trabalha com JSF com certeza já viu os ids dos elementos html gerados por ele da seguinte maneira  form:idElementoPai:idElemento . Mesmo usando a propriedade prependId = false da tag h:form alguns elementos aninhados ganham o id do pai.

Se você usa javascript puro para buscar os elementos pelo id utilizando document.getElementById(“form:idElementoPai:idElemento”) não temos problema algum, tudo funciona! Porém quando utilizamos jquery , a seleção de um elemento por id $(‘#form:idElementoPai:idElemento’)  simplesmente não funciona, e muitas vezes adotei a alternativa de buscar pelo seletor de classe, me obrigando a adicionar classes css únicas(mas não é necessário defini-las em um arquivo css, basta declarar no elemento).

Porém é possível sim utilizar o seletor do Jquery nesses casos desses ids compostos, bastando adicionar o \\ antes do caracter :(dois pontos)  ficando da seguinte maneira:

$('#form\:idElementoPai\:idElemento')

mai 03

Equals com Objeto do tipo proxy do hibernate

Há tempos que não posto nada, estou devendo muita coisa. Mas essa aqui eu tava me ferrando e acho que vale a pena registrar.

A situação é a seguinte: Tenho uma entidade A que se relaciona com a entidade B  em um relacionamento OneToOne, porém não quero utilizar o carregamento eager padrão para este relacionamento. Para resolver isso base adicionar a propriedade fetch=FetchType.LAZY na anotação OneToOne.  Mas como dizia Joseph Climber, a vida é uma caixinha de surpresas. Não é que pra minha surpresa o cache do hibernate resolveu funcionar em um select e manteve um objeto do tipo B que eu já tinha carregado a partir de um do tipo  A. Ou seja, no meio da listagens de objetos do tipo retornados do meu select * , tinha um intruso do tipo lazy do hibernate no meio da listagem WTF???!! . Ou seja, meu equals (gerado pelo eclipse) estava executando a instrução if (getClass() != obj.getClass()) e retornando true, uma vez que aquele bendito objeto lazy intruso não era da mesma classe!!

Agora chega de blablabla e vamos pras soluções:

Solução 1:

Devemos adicionar a seguinte verificação:

Onde tínhamos:  if (getClass() != obj.getClass())

Devemos ter agora:

Class<?> objProxyClass = 
HibernateProxyHelper.getClassWithoutInitializingProxy(obj);
 if (getClass() != obj.getClass() && getClass()!= objProxyClass )

e voi là , na chamada ao método getClassWithoutInitializingproxy é retornada a classe original do meu proxy e o if seguinte funciona sem problema algum!

Solução 2:

Essa solução foi retirada da documentação do hibernate

 if( !(obj instanceof B)) return false;

Essa é bem mais simples e também funciona!!

Agora fica a seu critério a utilização de uma ou de outra.

Lembrando que toda vez que seu objeto tiver a possibilidade de ser um proxy do hibernate nunca utilize diretamente os atributos no equals, faça as comparações sempre utilizando os métodos GETTERS!!!

É isso, se alguém souber uma situação que uma solução ou outra não atenda pode comentar aí, até a próxima.