sexta-feira, 17 de dezembro de 2010

Oracle: Inserir data em campo timestamp no oracle

INSERT INTO SIS.USUARIO
(ID,NOME,DATA_NASCIMENTO,INSERT_DATA)
VALUES
  (44,'ALEXANDRE PALMEIRA',TO_DATE('12/01/1983','MM-DD-YYYY'),TO_TIMESTAMP('07/15/2009 16:17:47', 'MM-DD-YYYY HH24.MI.SSXFF'));

quarta-feira, 8 de dezembro de 2010

Pesquisar em campo valor no formato brasileiro - 0.000,00

Para efetuar uma pesquisa em um campo Double, o valor deve estar no formato americano 0,000.00.

Porém, o usuário precisa digitar o valor no formato brasileiro 0.000,00.

Podemos resolver esse problema utilizando o método replace:

A propriedade pesquisaValue recebe o valor digitado pelo usuário no JSF no formato brasileiro, então utilizamos o replace para convertê-lo para o formato americano.

daoView
.getFindByValorPago( pesquisaValue.replace(".", "").replace(",",".") );




Com isso: 1.000,00 ou 1000,00 é convertido para 1000.00 e a pesquisa é efetuada.


quarta-feira, 20 de outubro de 2010

Exemplo de utilização do Quartz

O que é o Quartz?


É um framework de agendamento de tarefas.


Com ele você pode por exemplo agendar uma tarefa para executar: uma vez por dia, um vez por semana, uma vez por mês, uma vez a cada 5 minutos etc.


Obs: A finalidade desse post é mostrar de forma rápida e simples algumas funcionalidade desse framework, para que você inicie seu aprendizado no mesmo. Para maiores informações entre no site do Quartz, pois o mesmo tem muito mais recursos do que o apresentado aqui!


Utilizando o Quartz:


Faça o download da versão mais recente no site: http://www.quartz-scheduler.org/, descompacte o arquivo e copie o jar (quando esse post foi escrito a versão era quartz-1.8.3.jar) para o diretório lib de seu projeto.


Criaremos as seguintes classes:
1) Agenda - Responsável pelo agendamento das tarefas.
2) JobDia - Job que será executado uma vez por dia.
3) JobHora - Job que será executado a cada 60 minutos.


Classe Agenda:


 public class Agenda implements ServletContextListener {
 public static Scheduler sched;
 private Logger log;

 @SuppressWarnings("static-access")
 protected void init() throws ObjectAlreadyExistsException {

  try {
   /* Fábrica para criar instância de Scheduler */
   StdSchedulerFactory schedFactory = new StdSchedulerFactory();

   getLog().info("---------------- Criar Agendador ----------------");
   Agenda.sched = schedFactory.getScheduler();


   /* ************************Inicio Job Hora *****************************/
   getLog().info("---------------- Criando Tarefa: JobHora para ser executada a cada 60 minutos ----------------");
   JobDetail jobHora = new JobDetail("JobIntegraBysoft",Scheduler.DEFAULT_GROUP, JobHora.class);

   getLog().info("---------------- Criar Gatilho Job Hora  ----------------");
   SimpleTrigger sptJobHora = new SimpleTrigger(
     "JobHora", sched.DEFAULT_GROUP, new Date(), null,
     SimpleTrigger.REPEAT_INDEFINITELY, 3600L * 1000L);

   getLog().info("---------------- Faz o Agendamento de JobHora ----------------");
   java.util.Date ft = sched.scheduleJob(jobHora, sptJobHora);

   /* Imprime informações do Job */
   getLog().info(jobHora.getFullName() + " Foi programado para funcionar em: "
     + ft + " e repete baseado na expressão: ");
   /* ************************ Fim Job Hora *******************************/


   /* ************************ Inicio Job Dia *****************************/
   getLog().info("---------------- Criando tarefa: JobDia para ser executado todos os dias as 22 horas ----------------");
   JobDetail JobDia = new JobDetail("JobDia",Scheduler.DEFAULT_GROUP,
      JobDia.class);

   getLog().info("---------------- Criar Gatilho Para JobDia  ----------------");
   CronTrigger ctgJobDia = new CronTrigger("JobDia", sched.DEFAULT_GROUP);
   /* setCronExpression(* Segundos,* Minutos,* Horas,* Dias do mês,* Mês,* Dias da semana) */
   ctgJobDia.setCronExpression("0 00 22 * * ?");

   getLog().info("---------------- Faz Agendamento de JobDia ----------------");
   java.util.Date dataAniversariosDoDia = sched.scheduleJob(JobDia, ctgJobDia);

   /* Imprime informações do Job */
   getLog().info(JobDia.getFullName() + " Foi programado para funcionar em: "
     + dataAniversariosDoDia + " e repete baseado na expressão: "); 
   /* ************************ Fim Job Dia **************************** */


   /* Iniciar execução do Scheduler */
   Agenda.sched.start();   



  } catch (Exception e) {
   System.out.println("\n\nErro ao tentar iniciar Scheduler .\n\n");
   e.printStackTrace();
  }
 }


 public void contextInitialized(ServletContextEvent ce) {
  try{
   init();
  }catch (Exception ex) {
   ex.getStackTrace();
  }
 }



 public void contextDestroyed(ServletContextEvent arg0) {
  // Finaliza o schedule
  restart();
 }



 public void restart() {
  try {
   Agenda.sched.shutdown(true);
  } catch (Exception ex) {
   getLog().error("Erro ao tentar reiniciar as tarefas");
   getLog().error(ex.getMessage(), ex);
  }
 }



 protected Logger getLog() {
  if (this.log == null) {
   this.log = Logger.getLogger("AÇÃO : ");
  }

  return this.log;
 }



}


 
Adicione o listener no seu web.xml
<listener>
  <listener-class>br.com.lpc.ganymede.quartz.Agenda</listener-class>
</listener>






Classe JobHora


public class JobHora implements Job {
 @Override
 public void execute(JobExecutionContext arg0) throws JobExecutionException {
  System.out.println("Executando Job Hora");
 }
}








Classe JobDia



public class JobDia implements Job {
 @Override
 public void execute(JobExecutionContext arg0) throws JobExecutionException {
  System.out.println("Executando Job Dia");
 }
}



Execute a aplicação, e veja o resultado na console:

23:06:42,330 INFO  [StdSchedulerFactory] Quartz scheduler version: 1.4.5
23:06:42,330 INFO  [AÇÃO : ] ---------------- Criando Tarefa: JobHora para ser executada a cada 60 minutos ----------------
23:06:42,334 INFO  [AÇÃO : ] ---------------- Criar Gatilho Job Hora  ----------------
23:06:42,338 INFO  [AÇÃO : ] ---------------- Faz o Agendamento de JobHora ----------------
23:06:42,339 INFO  [AÇÃO : ] DEFAULT.JobIntegraBysoft Foi programado para funcionar em: Wed Oct 20 23:06:42 BRST 2010 e repete baseado na expressão:
23:06:42,339 INFO  [AÇÃO : ] ---------------- Criando tarefa: JobDia para ser executado todos os dias as 22 horas ----------------
23:06:42,341 INFO  [AÇÃO : ] ---------------- Criar Gatilho Para JobDia  ----------------
23:06:42,348 INFO  [AÇÃO : ] ---------------- Faz Agendamento de JobDia ----------------
23:06:42,351 INFO  [AÇÃO : ] DEFAULT.JobDia Foi programado para funcionar em: Wed Oct 20 23:07:00 BRST 2010 e repete baseado na expressão:
23:06:42,351 INFO  [QuartzScheduler] Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
23:06:42,480 INFO  [STDOUT] Executando Job Hora
23:06:47,421 INFO  [ServerImpl] JBoss (Microcontainer) [5.0.0.GA (build: SVNTag=JBoss_5_0_0_GA date=200812042120)] Started in 52s:48ms
23:07:00,012 INFO  [STDOUT] Executando Job Dia



Bons estudos!

Exemplos de utilização do Criteria

public class ExemplosCriteria<T> {
 protected Class<T> persistentClass;
 protected Session session;

 public ExemplosCriteria(Session session, Class<T> persistentClass){
  this.session = session;
  this.persistentClass = persistentClass;
 }

 /** Retorna todos os registros da tabela com ordenação */
 @SuppressWarnings("unchecked")
 public List<T>findAll(String fieldOrder){
  Criteria c = this.session.createCriteria(persistentClass);
  c.addOrder(Order.asc(fieldOrder));
  return c.list();
 }

 /** Pesquisa de acordo com o campo e valor fornecido. retorna somente um objeto */
 @SuppressWarnings("unchecked")
 public T loadByField(String field, String value){
  Criteria c = this.session.createCriteria(persistentClass);
  c.add(Restrictions.eq(field, value));
  T t = (T) c.uniqueResult();
  return t;
 }

 /** Pesquisa de acordo com campo, valor (em qualquer posição do campo), ordena, e limita resultado */
 @SuppressWarnings("unchecked")
 public List<T> findByNameAnyWhere(String fieldName, String fieldValue,String fieldOrder, Integer maxResults){
   Criteria c = this.session.createCriteria(persistentClass);
   c.add(Restrictions.ilike(fieldName, fieldValue,MatchMode.ANYWHERE));
   c.addOrder(Order.asc(fieldOrder));
  
   if (maxResults != null) {  
    c.setMaxResults(maxResults);
   }
  
   return c.list();
 }

 /** Semelhante ao exemplo acima, porém, faz join em outras "tabelas/objetos" */
 @SuppressWarnings("unchecked")
 public List<T> findByNameAnyWhereJoin(String fieldName, String fieldValue,String fieldOrder, Integer maxResults){ 
   Criteria c = session.createCriteria(NotaFiscal.class, "nota");
   c.createAlias("nota.itens", "item",CriteriaSpecification.LEFT_JOIN);
   c.createAlias("item.usuario", "usuario",CriteriaSpecification.LEFT_JOIN);
   c.createAlias("usuario.unidadeOperacional", "unidade",CriteriaSpecification.LEFT_JOIN);
   c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
   c.addOrder(Order.asc(fieldOrder));
  
   Integer numero = Integer.parseInt(fieldValue);
   c.add(Restrictions.eq(fieldName, numero));
   return c.list();  
 }

 /** OR/AND no criteria */
 @SuppressWarnings("unchecked")
 public List<Usuario> getChamadosAbertosUsuario(Usuario usuario){  
     Criteria c = session.createCriteria(Usuario.class);
   
     Criterion c1 = Restrictions.eq("status", "A");
     Criterion c2 = Restrictions.eq("status", "C");
     c.add(Restrictions.or(c1, c2));
   
     c.add(Restrictions.eq("usuario", usuario));
     c.addOrder(Order.desc("id"));
   
     return c.list();
 }

 /** Criteria com cache de query ativado */
 @SuppressWarnings("unchecked")
 public List<View_Vencimentos> getVencimetosDoCliente(Integer matrizId){
  Criteria c = session.createCriteria(View_Vencimentos.class);
  c.add(Restrictions.eq("id_matriz", matrizId));
  c.addOrder(Order.asc("vencimento"));
 
  c.setCacheable(true);
  c.setCacheMode(CacheMode.NORMAL);
  return c.list();
 }

}

domingo, 17 de outubro de 2010

Exemplo de teste unitário com o JUnit



Faça o download do jar no site do JUnit http://www.junit.org. Em seguida coloque-o no diretório lib de seu projeto.
Testando com o Junit:

O método getNomeCompleto da classe Usuario deve retornar o nome, seguido de um espaço e o ultimoNome.




Vamos testar com o JUnit para assegurar que temos um espaço em branco entre as duas propriedades:
Como podemos ver, o código funciona perfeitamente.
Agora veremos outra situação, onde ocorre uma falha:

 Uma pequena correção no método:

E o código passa no teste:


Esses são alguns exemplos de onde e como utilizar o JUnit.
Podemos fazer os testes sem a necessidade de uma interface gráfica. Isso acaba por reduzir o tempo, já que, com uma interface, seria necessário carregar o sistema, fazer os testes, corrigir erros, carregar novamente, testar novamente etc.

terça-feira, 5 de outubro de 2010

Hibernate: Tipos de consultas suportadas pelo Hibernate

Esse pequeno post é destinado aos novatos em Hibernate que geralmente tem dúvidas em relação aos tipos de pesquisa suportados por esse framework. Navegando nos fóruns encontramos vários nomes como (criteria, HQL, SQL Nativo etc.), essa salada de nomes pode complicar o inicio do aprendizado.
O que precisa ficar claro é que todas as opções abaixo são utilizadas para efetuar consultas no banco de dados. Cada uma com suas vantagens/desvantagens em relação às outras.
Esses são os tipos suportados pelo Hibernate:
1.       HQL
2.       JPA QL
3.       SQL Nativo
4.       Criteria
Exemplos simples:
HQL:
Ex1: from Usuario
Retorna todos os objetos da classe Usuario (não é necessário informar select antes do from).
Ex2: select from Usuario as u where u.nome = ‘Alexandre’
Exemplo utilizando apelido (u) e restrição (where).  A palavra chave (as) na definição do apelido é opcional.
JPA QL
Ex1: select from Usuario
Retorna todos os registros da classe Usuario (note que em JPA QL você deve informar select antes do from).
SQL Nativo
Ex1: List list = session.createSQLQuery(“select * from Usuario”)
                                               .addEntity(Usuario.class)
                                               .list();

Criteria
Ex1: List<Usuario> list = session.createCriteria(Usuario.class)
                                               .list();
Retorna todos os registros da classe Usuario.
Ex2: Usuario usuário = session.createCriteria(Usuario.class)
                                               .add(Restrictions.eq(“nome”,”Alexandre”)
                                               .uniqueResult();
Exemplo de consulta utilizando restrição e limitando o retorno a um único objeto.

segunda-feira, 20 de setembro de 2010

JBoss: Só aceita conexões de localhost/127.0.0.1.

Versão: 5.0.0.GA

Essa versão o JBoss vem configurada para somente aceitar conexões de localhost/127.0.0.1. A página não será localizada caso você tente acessar o sistema por outro computador.

Para liberar o acesso para outros computadores, utilize a opção (-b + IP do servidor) como no exemplo abaixo:

D:\Programas\jboss-5.0.0.GA-jdk6\bin\run.bat -b 192.168.0.1

quinta-feira, 1 de julho de 2010

Hibernate: dynamicUpdate e dynamicInsert

O que é?

Com o Hibernate é possível detectar as propriedades que foram modificadas, e gerar uma declaração SQL UPDATE/INSERT somente com essas colunas. Com esse recurso você pode ter algum ganho de performance. Por padrão esse recurso vem desabilitado, com isso, o Hibernate inclui “todas” as propriedades definidas na sua classe em uma SQL UPDATE/INSERT.

Configurando!

Para ativar o recurso de geração dinâmica de SQL basta adicionar o mapeamento (dynamicUpdate=true e/ou dynamicInsert=true) no mapeamento de sua classe:

@Entity
@org.hibernate.annotations.Entity(dynamicUpdate=true, dynamicInsert=true)
public class Moeda implements Serializable {

Quando utilizar esse recurso?

Utilize esse recurso em tabelas com grande quantidade de colunas (ex: mais de 50), ou em tabelas com grandes quantidades de dados (ex: campos Blob de texto/imagem).

terça-feira, 29 de junho de 2010

Hibernate Exception: Illegal attempt to associate a collection with two open sessions

Esse problema começou a correr quando passei a utilizar o pattern (Open Session In View). E ocorre quando temos uma collection, por exemplo, em um relacionamento @OneToMany.


No meu caso, quando eu adicionava um objeto a collection dava tudo certo:

public void saveMensagem(ActionEvent event){
   dao = new ChamadoDao<Chamado>(HibernateUtil.getSession(),Chamado.class);
   try{
      mensagem.setChamado(chamado);
      mensagem.setUsuario(LoginMB.getUsuarioLogado());
      chamado.getMensagens().add(mensagem);
      dao.update(chamado);
   }catch (Exception e) {
      e.printStackTrace();
   }
}

O problema ocorria quando eu fazia um update no objeto que contem a collection, sem fazer alterações na mesma:

public void save(ActionEvent event){
   dao = new ChamadoDao<Chamado>(HibernateUtil.getSession(),Chamado.class);
   try{
      if(chamado.getUsuario() == null){
         chamado.setUsuario(LoginMB.getUsuarioLogado());
         dao.save(chamado);
      }else{
         dao.update(chamado);
      }
   }catch (Exception e) {
      e.printStackTrace();
   }
}


Para resolver o problema eu mudei de session.update para session.merge:

public void save(ActionEvent event){
   dao = new ChamadoDao<Chamado>(HibernateUtil.getSession(),Chamado.class);
   try{
      if(chamado.getUsuario() == null){
         chamado.setUsuario(LoginMB.getUsuarioLogado());
        dao.save(chamado);
      }else{
         dao.merge(chamado);
      }
   }catch (Exception e) {
      e.printStackTrace();
   }
}

quarta-feira, 23 de junho de 2010

Layout do teclado altera automaticamente no Eclipse

Utilizando o editor do Eclipse, ao pressionar as teclas (ALT"Esquerda"+SHIFT) o layout do teclado é alterado para inglês, pressionando novamente as teclas de atalho ele volta ao normal.

Essa alteração não é feita pelo Eclipse e sim pelo Windows. Isso acaba causando alguns transtornos quando não sabemos as teclas que pressionamos, e é necessário reiniciar o Eclipse para a configuração voltar ao normal.

Para desativar ou alterar as teclas de atalho você deve ir em: Configurações regionais no seu Windows -> Idiomas -> Detalhes -> Configurações de tecla.

segunda-feira, 21 de junho de 2010

Porque evitar o saveOrUpdate do Hibernate?

Para o Hibernate saber se o saveOrUpdate deve fazer um insert ou um update, ele faz um select na tabela e verifica se o registro já existe, caso exista ele faz um update do contrário um insert. Com isso temos uma ida adicional ao banco de dados.

Para evitar o select adicional você pode utilizar um mapeamento <Version> ou <TimeStamp> e uma propriedade na entidade. O Hibernate gerencia os valores internamente para controle de concorrência otimista, um dos efeitos desse gerenciamento é que um valor de data e hora vazia ou uma versão 0 ou null, indica que é uma instância nova e a mesma será automaticamente inserida, sem que um select seja efetuado.

Ou utilize os métodos save e update separadamente.

sábado, 19 de junho de 2010

java.io.NotSerializableException: org.hibernate.util.MarkerObject

Problema

java.io.NotSerializableException: org.hibernate.util.MarkerObject

Ao utilizar o a4j:keepAlive nos arquivos jsf, o mesmo exige que o Managed Bean e suas dependências implementem Serializable. Porém, a classe MarkerObject do hibernate (versão 3.3.2.GA) não implementa.

Solução

Implementar Serializable na classe MarkerObject

1) Edite o arquivo (hibernate-distribution-3.3.2.GA\project\core\src\main\java\org\hibernate\util\MarkerObject.java).

2) Implemente Serializable na classe. Deve ficar assim:
     import java.io.Serializable;
     public class MarkerObject implements Serializable{

3) Execute javac MarkerObject.java. Isso vai gerar o arquivo MarkerObject.class.

4) Descompacte o arquivo (hibernate-distribution-3.3.2.GA\hibernate3.jar).

5) Substitua o arquivo (hibernate3\org\hibernate\util\ MarkerObject.class) pelo arquivo .class gerado no passo 3.

6) Gere o arquivo .jar com (jar cvfm) ou utilize um programa que faça compactação jar.
A raiz do novo arquivo hibernate3.jar deve ser igual ao original com os seguintes diretórios: META-INF e org.

7) Substitua o arquivo hibernate3.jar do diretório lib da sua aplicação ou do seu JBoss pelo arquivo gerado no passo 5.

Você pode utilizar o exemplo acima para fazer outras customizações no código fonte do hibernate.

segunda-feira, 14 de junho de 2010

Converter 0 em null

Problema

JSF retorna 0 (Zero) quando o valor não é preenchido.
Ex: Existe uma propriedade no Bean chamada (idade) e um inputText no JSF vinculado a propriedade do Bean. Quando o valor não é preenchido no inputText o JSF retorna 0 para o Bean, quando deveria retornar null.

Solução

Edite o arquivo \jboss-5.1.0.GA\server\default\deploy\properties-service.xml e insira a tag:

<attribute name="Properties">org.apache.el.parser.COERCE_TO_ZERO=false</attribute>

dentro da tag:
<mbean code="org.jboss.varia.property.SystemPropertiesService" name="jboss:type=Service,name=SystemProperties">