ago 16

Pesquisa

Pessoal, estou testando uma ferramenta de questionário, quem puder responder por favor, são só 4 questões bobinhas! É só clicar no link abaixo!
Questionário de teste

ago 03

Conversor em JSF2 com Servlet 3.0

Neste post falarei de como criar um converter para uma classe do meu modelo e também como utilizá-lo com um componente selectOneMenu.

Primeiramente, precisamos sobrescrever o método equals lá do nosso bean ( ex: MeuBean.java) para o qual será feito o converter.  Caso eu o identifique por um atributo específico, por exempo um id, o nosso equals ficaria da seguinte maneira:

 
        @Override
        public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Conta other = (Conta) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

Em seguida criamos uma nova classe chamada meuBeanConverter que irá implementar a interface Converter do pacote  javax.faces.convert , vamos anotá-la com a seguinte annotation: @FacesConverter, setando o atributo forClass da anotação com a nossa classe MeuBean.class .

Essa interface Converter possui 2 métodos que precisamos implementar:

  1. public Object getAsObject(FacesContext arg0, UIComponent arg1, String texto)
  2. public String getAsString(FacesContext arg0, UIComponent arg1, Object obj)

Onde o primeiro será acessado na fase do jsf : apply request values, quando o formulário for submitado, convertendo o atributo value  da tag option do html no objeto correspondente da nossa classe MeuBean. E o segundo no caminho inverso, quando queremos a partir de um objeto da nossa classe MeuBean,  mostrar no selectBox html o nosso objeto.

 
@FacesConverter(forClass = MeuBean.class)
public class ContaConverter implements Converter {

	@Override
	public Object getAsObject(FacesContext arg0, UIComponent arg1, String texto) {
		if (texto == null || texto.equals("")) {
			return null;
		}

		Long longId = Integer.valueOf(texto).longValue();
		MeuBean bean = //alguma maneira de recuperar o bean pelo atributo id
		return bean;

	}

	@Override
	public String getAsString(FacesContext arg0, UIComponent arg1, Object obj) {
		// TODO Auto-generated method stub
		if (obj == null || obj.toString().equals("")) {
			return "";
		}
		return ((MeuBean) obj).getId().toString();
	}

}

Por fim no nosso html teremos no value do h:selectOneMenu  a propriedade que receberá o valor escolhido que será convertido para um objeto da classe MeuBean, e na listagem de f:selectItems uma lista de objetos MeuBean ( Ex: List<MeuBean> meusBeans ).

<h:selectOneMenu id="meuBean" value="#{meuMB.meuBean}">
	<f:selectItems value="#{meuMB.meusBeans}" ></f:selectItems>
</h:selectOneMenu>

Apenas um detalhe a mais, não setando o atributo itemLabel do f:selectItems, será necessário sobrescrever o toString do MeuBean, caso contrário será impresso a representação do objeto.

ago 01

Estados de um objeto gerenciado por um EntityManager

Neste post falarei um pouco de como a especificação JPA 2 trata as entidades manipuladas pelos EntityManagers. As principais funções dos EntityManagers são:

  1. Como o próprio nome já diz, gerenciar as entidades;
  2. Sincronizar o estado dos objetos com os dados correspondentes no banco de dados

Ao falarmos em gerenciar uma entidade nos referimos a como um EntityManager manipula uma entidade, e para isso é necessário entender os estados possíveis que uma instância pode assumir para um EntityManager. São 4 estados possíveis:

  • Transient

Neste estado seu objeto acabou de ser criado e o atributo que foi anotado com @Id não possui valor . Toda vez que você dá um new em um objeto de uma Entidade este é o estado que ele se encontrará.

  • Managed

Neste estado o objeto possui valor no atributo anotado com @Id, sendo este valor atribuido pelo EntityManager e não setado manualmente. Toda vez que ocorrer uma sincronização através de um flush ou um commit, os dados do objeto são atualizados no os dados do banco de dados.

  • Removed

Neste estado,assim como no estado managed, o objeto possui valor no atributo anotado com @Id, sendo este valor atribuido pelo EntityManager e não setado manualmente. Porém quando ocorrer uma sincronização através de um flush ou um commit, o objeto passa a não ter mais vínculo com o banco de dados.

  • Detached

Neste estado,assim como no estado managed, o objeto possui valor no atributo anotado com @Id, sendo este valor atribuido pelo EntityManager ou setado manualmente. Porém este objeto não possui mais vínculo com o EntityManager, logo ele não será mais sincronizado com o banco de dados, e qualquer alteração realizada com ele residirá somente na memória da aplicação e não no banco de dados.

Para trocar de estados o EntityManager nos fornece os seguinte métodos:

  • persist : Transient -> Managed
  • merge : Transient -> Managed / Detached -> Managed
  • evict, clear ou close : Managed -> Detached
  • remove : Managed -> Removed

 

Tendo esses estados em mente e também como transitar entre eles, você consegue ter um controle muito melhor sobre o que você está fazendo ao utilizar JPA.

Fica a dica!