Entao pessoal, finalmente apareceu uma boa oportunidade e eu quero muito essa vaga…
Ontem eu fiz uma prova escrita e consegui passar… e hoje é o dia da prova pratica…
Que vai consistir na criação de um CRUD utilizando JSF 1.2 e algum outro framework à nossa escolha… escolhi utilizar o JPA. OK
Mas ele disse tambem que a utilização de design patterns e boas práticas seriam bem avaliados… entao eu criei um projeto aqui e queria saber da opiniao de vcs.
Organização do Projeto:
queria que vocês avaliassem o meu SINGLETON:
[code]package br.com.ceuma.persistence;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class EntityManagerFactorySingleton {
private static final EntityManagerFactorySingleton singleton = new EntityManagerFactorySingleton();
private static EntityManagerFactory fabrica = null;
private final String unidadeDePesistencia;
private EntityManagerFactorySingleton() {
this.unidadeDePesistencia = new Configuracoes().getConfigution("unidade_de_persistencia");
System.out.println("Criando Entity");
}
public static EntityManagerFactorySingleton getInstance(){
return singleton;
}
public EntityManager getManager(){
try {
if(fabrica == null){
fabrica = Persistence.createEntityManagerFactory(this.unidadeDePesistencia);
return fabrica.createEntityManager();
} else {
return fabrica.createEntityManager();
}
} catch (Exception e) {
System.err.println("ERRO: " + e.getMessage());
return null;
}
}
}
[/code]
essa classe é responsavel por criar EntityManagers… ela utiliza uma outra classe utilitaria… para ler um arquivo properties… para preencher o metodo
Persistence.createEntityManagerFactory();
Eu creio que isso seja uma boa prática, particularmente nao acho interessante colocar esse tipo de informação no codigo diretamente.
[code]package br.com.ceuma.persistence;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Configuracoes {
private InputStream stream;
public Configuracoes() {
stream = this.getClass().getResourceAsStream("config.properties");
}
public String getConfigution(String configucao){
Properties props = new Properties();
try {
props.load(stream);
return props.getProperty(configucao);
} catch (IOException e) {
System.err.println("ERRO NA LEITURA DO ARQUIVO DE CONFIGURAÇÃO) " + e.getMessage());
return null;
}
}
}
[/code]
e agora o meu DAO
[code]package br.com.ceuma.dao;
public interface DAO {
void save(T t);
void remove(T t);
T find(Long id);
void update(T t);
}
[/code]
meu BackingBean ja mapeado
[code]package br.com.ceuma.model;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name=“tb_contato”)
public class Contato {
@Id @GeneratedValue
private Long id;
private String nome;
@Column(unique=true)
private String email;
private String endereco;
@Column(name="data_nascimento")
private Date dataNascimento;
// getters & setters
[/code]
a classe que implementa o DAO
[code]package br.com.ceuma.dao;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;
import br.com.ceuma.model.Contato;
import br.com.ceuma.persistence.EntityManagerFactorySingleton;
public class ContatoDAO implements DAO {
private EntityManager manager;
public ContatoDAO() {
this.manager = EntityManagerFactorySingleton.getInstance().getManager();
}
public void save(Contato t) {
EntityTransaction transacao = this.manager.getTransaction();
transacao.begin();
try {
this.manager.persist(t);
transacao.commit();
} catch (Exception e) {
System.err.println("ERRO AO SALVAR O OBJETO: " + t + "\n" + e.getMessage());
transacao.rollback();
} finally {
this.manager.close();
}
}
public void remove(Contato t) {
EntityTransaction transacao = this.manager.getTransaction();
transacao.begin();
try {
this.manager.remove(t);
transacao.commit();
} catch (Exception e) {
System.err.println("ERRO AO REMOVER O OBJETO: " + t + "\n" + e.getMessage());
transacao.rollback();
} finally {
this.manager.close();
}
}
public Contato find(Long id) {
EntityTransaction transacao = this.manager.getTransaction();
transacao.begin();
try {
Contato contato = this.manager.find(Contato.class,id);
transacao.commit();
return contato;
} catch (NoResultException e) {
System.err.println("Sem resultados para a consulta: " + e.getMessage() );
transacao.rollback();
return null;
} finally {
this.manager.close();
}
}
public void update(Contato t) {
EntityTransaction transacao = this.manager.getTransaction();
transacao.begin();
try {
this.manager.merge(t);
transacao.commit();
} catch (PersistenceException e) {
System.err.println("Erro ao atualizar o objeto: " + e.getMessage() );
transacao.rollback();
} finally {
this.manager.close();
}
}
}
[/code]
organização das classes e outros arquivos:
e agora a parte WEB… eu escolhi utilizar o facelets tbm… pq acho que ele é importante pra organização do trabalho… acho bem ‘elegante.’
segue o meu template:
[code]
Teste do UNICEUMA <!-- FRAGMENTO DO TOPO -->
<div id="topo">
<ui:insert name="topo">
<ui:include src="/fragmentos/topo.xhtml" />
</ui:insert>
</div>
<!-- FRAGMENTO DO MENU -->
<div id="menu">
<ui:insert name="menu">
<ui:include src="/fragmentos/menu.xhtml" />
</ui:insert>
</div>
<!-- COTEUDO PRINCIPAL -->
<div id="principal">
<ui:insert name="principal">
</ui:insert>
</div>
<!-- FRAGMENTO DO RODAPE -->
<div id="rodape">
<ui:insert name="rodape">
<ui:include src="/fragmentos/rodape.xhtml" />
</ui:insert>
</div>
</div>
[/code]
entao… queria saber o que vocês acharam… o que vcs acham que eu poderia fazer pra melhorar…
como estao minhas ‘boas praticas’… e se vcs puderem me ajudar a deixar esse projeto ai o mais OO possivel, seria magnifico tbm.
desde ja agradeco MESMO…
edit: pessoal, irei comentar todo o codigo ainda…