Seam / Hibernate / JSF = Deus nos Acuda

29 10 2008

Introdução

Estou começando a trabalhar com o SEAM e por isso resolvi postar aqui algumas coisas que estou nesses últimos 10 dias. Grande parte do conhecimento aqui descrito foi obtive com a valorosa ajuda do meu amigo Kadu e a curva de aprendizado como em praticamente tudo que envolva java e sua sopa de letrinhas é longa.

Alguns Links

  1. 3 Vídeo Aulas, a primeira mostra como rodar o jboss a segunda como iniciar um projeto no seam e a terceira como rodar o exemplos do seam;
  2. JBoss Tool: Plugin para o eclipse que facilita o trabalho com o JBoss;
  3. JSF: Introdução ao JSF.

Persistência

A camada de persistência dos dados é feita usando o hibernate. No nosso caso vamos criar apenas uma tabela chamada modalidade, veja a classe com o mapeamento.

package br.unioeste.sgppls;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import org.jboss.seam.annotations.Name;

@Entity
@Table(name="modalidade")
@Name("modalidade")
public class Modalidade implements java.io.Serializable {

	private int mdlCodigo;
	private String mdlDescricao;
	private String mdlDiaSemana;

	public void modalidade(){}

	public void modalidade(int mdlCodigo, String mdlDescricao, String mdlDiaSemana){
		this.mdlCodigo = mdlCodigo;
		this.mdlDescricao = mdlDescricao;
		this.mdlDiaSemana= mdlDiaSemana;
	}

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="Mdl_Codigo")
	public int getMdlCodigo(){
		return this.mdlCodigo;
	}

	public void setMdlCodigo(int cod){
		this.mdlCodigo = cod;
	}

	@Column(name="Mdl_Descricao")
	public String getMdlDescricao(){
		return this.mdlDescricao;
	}

	public void setMdlDescricao(String descricao){
		this.mdlDescricao = descricao;
	}

	@Column(name="Mdl_DiaSemana")
	public String getMdlDiaSemana(){
		return this.mdlDiaSemana;
	}

	public void setMdlDiaSemana(String dia){
		this.mdlDiaSemana = dia;
	}
}

Coisas Importantes:

  • @Table : define o noma da tabela ao qual esta classe esta mapeando; (contexto do hibernate)
  • @Name: define o nome do objeto no contexto SEAM, este nome será usado nas páginas de visão, no caso modalidade.mdlDescricao irá retornar o valor do altributo mdlDescricao;
  • @Id : define que aquele atributo faz parte da chave;
  • @GeneratedValue(strategy=GenerationType.IDENTITY): diz qual é o método de auto incremento do campo chave, no caso estou usando um SQL Server com o tipo inteiro IDENTITY, se estive usando o postgres então usaria @GeneratedValue(strategy=GenerationType.SEQUENCE) juntamente com o nome da sequência que foi criada para o seu campo;
  • @Column: define a coluna ao qual o atributo está ligado;
  • Todos os atributos DEVEM possuir métodos SET e GET.

Controle

Aqui estão as suas regras de negócio, no nosso caso vai existir um método para salvar e outro que retornará um list que será usada pela visão em um dataTable.

package br.unioeste.sgppls;

import java.util.List;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;

@Name("Modalidadeteste")
public class ModalidadeTeste {

	@In(required=false) @Out(required=false)
	private Modalidade modalidade;

	@Out
	private List <Modalidade> modalidades;

	@In(create=true)
	private EntityManager entityManager;

	@Create
	public void find(){
		modalidades = entityManager.createQuery("from Modalidade").getResultList();
	}
	public String getModalidade(){
		return this.modalidade.getMdlDescricao();
	}
	public void salvar(){
		entityManager.persist(modalidade);
		modalidade = new Modalidade();
	}
}

Coisas Importantes

  1. @In / @Ou: levei um puta tempo até começar a entender esse treco :). Essas duas anotações dizem para o SEAM que o atributos será injetado (@In – o dado vem da visão) ou enviado (@Out – o dado que está no atributo é jogado na visão), por exemplo se na visão eu escrever #{modalidade.mdlDescricao} irá aparecer o dado que está dentro do atributo mdlDescricao do objeto modalidade que está atualmente instânciado em memória, isso aqui é importante somente irá existir um único objeto em memória. O required=false diz que se não existir uma chamada para o atributo então ele não vai fazer nada;
  2. @Create/ @Remove: indica que este método SEMPRE será executado após o objeto ser instanciado/destruído, se assemelha ao setp/teardown do JUnit;
  3. private EntityManager entityManager;:para  manipular o banco de dados será necessário usar o objeto do tipo EntityManager, o seam automaticamente cria este objeto quando a aplicação começa a roda, as configurações do mesmo podem ser obtidas no arquivo WEB-INF/components.xml,  isso facilita a nossa vida pois se você quer ter acesso a este objeto dentro da sua classe basta usar um @In no atributo, o nome do atributo por padrão deve ser entityManager, se você quiser mudar o nome então faça:
    @In(value=”entityManager”)
    private EntityManager em;
    Com isso o SEAM irá injetar no objeto em o objeto entityManager
  4. modalidades = entityManager.createQuery(“from Modalidade”).getResultList(): as consultas ao banco de dados podem ser feitas usando SQL Nativa ou através de HQL (Hibernate Query Language), que é uma coisa parecida com SQL mas que as vezes engana o programado, nesse exemplo o Hibernate acessar a classe Modalidade e extrair o nome da tabela que está anotada com @Table e todos os atributos que estão anotados com @Column ao final da consulta será retornado um List onde cada elemento será um objeto do tipo Modalidade.
  5. entityManager.persist(modalidade): irá realizar a persistência dos dados que estão no objeto modalidade no banco de dados
  6. modalidade = (Modalidade) entityManager.createQuery(“from Modalidade where Mdl_Codigo = 1”).getSingleResult(): Caso você queira preenche o objeto modalidade com os dads do banco então use o HQL para consultar pelo seu objeto. Tome cuidado pois caso a sua consulta não retorne o objeto então será lançada uma excessão!
  7. @In private FacesMessages facesMessages: injeta dentro do objeto facesMessages o objeto que irá manipular toda a parte de comunicação entre a regra de negócio e a visão, na visão as mensagens que forem setadas aqui serão exibidas no elemento <h:messages globalOnly=”true” styleClass=”message” id=”globalMessages”/>

Bom por hoje é só, na próxima vou tentar falar um pouco sobre a parte da visão e dos famigerados *.page.xml


Ações

Information

5 responses

14 01 2009
Fábio Silva

Cara, valeu por compartilhar essas dicas. Você foi bem objetiovo e claro. “Isso serve pra isso…”, sem muita firulagem.
Continue, vc tá ajudando legal!
🙂

21 03 2009
Eduardo

Muito boa dica Anselmo, valeu estava procurando por ajuda no google e encontrei o seu blog heheh vlews t++

24 03 2009
Allan Koch Veiga

Cara, muito bom… eu estou apanhando há algum tempo pra entender quando usar o a injeção e a ejeção de dependência… a pesar de simples, a sua explicação foi muito clara e fez com que muita coisa que eu já li fizesse sentido. Valeu!

24 03 2009
Allan Koch Veiga

Cara vai ser se você me clarear as idéias a respeito das navegações e contextos nos page.xml, que é outras coisa que ainda não esta muito claro pra mim. Quando você postar, poderia me avisar? allan.kv@gmail.com
Obrigado.

6 10 2009
caio

MInha Contrubuição…..Aulas de nosso amigo Marcos
http://www.megaupload.com/?d=S3PY45O7

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s




%d blogueiros gostam disto: