quinta-feira, 20 de dezembro de 2012

org.hibernate.AnnotationException: No identifier specified for entity

O problema ocorre porque a chave primária não foi definida!

Errado:
@Entity

@SequenceGenerator(name="SEQ_FIN_CLASSE",sequenceName="SEQ_FIN_CLASSE",allocationSize=1)
public class Classe implements Serializable{

@GeneratedValue(generator="SEQ_FIN_CLASSE",strategy=GenerationType.SEQUENCE)
private Integer id;
private String str_codigoclasse;
private String str_nomeclasse;
}


Certo:
@Entity

@SequenceGenerator(name="SEQ_FIN_CLASSE",sequenceName="SEQ_FIN_CLASSE",allocationSize=1)
public class Classe implements Serializable{

@GeneratedValue(generator="SEQ_FIN_CLASSE",strategy=GenerationType.SEQUENCE)
 @Id
private Integer id;
private String str_codigoclasse;
private String str_nomeclasse;
}


sexta-feira, 9 de novembro de 2012

Hibernate e campos timestamp

Ao pesquisar em um campo timestamp utilizando o criteria, a query não retorna nenhum registro caso as datas sejam iguais, ou não exibe os registro da data final.

Ex:

dataI  = 01/01/2012.
dataF = 01/01/2012.

c.add(Restrictions.between("insert_data", dataI, dataF));

Isso porque, a query está tentando localizar tudo que estiver entre 01/01/2012 00:00 e 01/01/2012 00:00. Porém, na tabela os registros estão armazenados com os horários (01/01/2012 10:15).

Para resolver esse problema, basta acrescentar um dia a data final.
Ex:

dataF.setDate(dataF.getDate() + 1);
c.add(Restrictions.between("insert_data", dataI, dataF));

Agora, a query irá procurar tudo que estiver entre 01/01/2012 00:00 e 02/01/2012 00:00.

quinta-feira, 1 de novembro de 2012

JSF: Inserir caractere em branco (espaço) dentro do h:outputText


<h:outputText value="#{processo.nref}   &#160;" />

quarta-feira, 24 de outubro de 2012

Selecionar último registro no Oracle


SELECT
  FOLLOWUP.POSICAOFLP_ID
FROM
  FOLLOWUP
WHERE
  FOLLOWUP.PROCESSO = '11850'
AND
     FOLLOWUP.ID = (SELECT MAX(FOLLOWUP.ID) FROM FOLLOWUP WHERE FOLLOWUP.PROCESSO = '11850')  

terça-feira, 23 de outubro de 2012

Descobrir qual/se propriedade do bean foi alterada



public class MyBean {
    private Long id;
    private String nome;
    private String campo2;
    public String getCampo2() {
        return campo2;
    }
    public void setCampo2(String campo2) {
        this.campo2 = campo2;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
}



public class Main {
 
    public static void main(String[] args) {
        MyBean bean1 = new MyBean();
         
        bean1.setId(new Long(1));
        bean1.setNome("MyBean name");
        bean1.setCampo2("MyBean campo2");
         
        MyBean bean2 = new MyBean();
         
        bean2.setId(new Long(1));
        bean2.setNome("MyBean nam2e");
        bean2.setCampo2("MyBean campo2");
 
        Field f[] = bean1.getClass().getDeclaredFields();
         
        for (int i = 0; i < f.length; i++) {
            Field field = f[i];
             
            BeanComparator bc = new BeanComparator(field.getName());
            int result = bc.compare(bean1, bean2);
             
            System.out.println("["+field.getName()+"]: "+result);
             
        }
    }

Se o resultado for diferente de 0, as propriedades são diferentes, com isso, sei quais campos foram alterados.

Fonte: http://javafree.uol.com.br/topic-11702-Descobrir-qual-propriedade-do-bean-foi-alterada.html

quinta-feira, 18 de outubro de 2012

Função SKIP Firebird

A função SKIP permite ignorar/saltar N registros para sem seguida retornar o restante.

Em conjunto com a função FIRST é possível ignorar N registros e retornar N registos. Ex: Ignorar os cinco primeiros registros e exibir os dois registros após os cinco ignorados.

Retorna apenas o primeiro usuário:

   SELECT FIRST 1
     nome
   FROM
     usuario
   ORDER BY
     nome

Retorna apenas o segundo usuário:

   SELECT FIRST 1 SKIP 1
     nome
   FROM
     usuario
   ORDER BY
     nome

Ignora os 5 primeiros usuários e retorna o restante:

   SELECT SKIP 5
     nome
   FROM
     usuario
   ORDER BY
     nome

quarta-feira, 26 de setembro de 2012

Efetuando cálculos de porcentagem em Java

Efetuando cálculos de porcentagem em Java

Cálculos de porcentagens estão presentes em boa parte das aplicações que desenvolvemos. Porém, há momentos em que a mente trava e não conseguimos lembrar com clareza como estes cálculos são feitos, principalmente em Java.

Esta anotação tem o objetivo de ser uma fonte de pesquisa para os momentos em que suas habilidades matemáticas insistirem em continuar ocultas.

Ex: 1 - Suponhamos que um produto que custe R$ 178,00 sofra um acréscimo de 15%. Qual o valor final do produto? Veja o código em Java:
public class Estudos{
  public static void main(String args[]){
    double valor = 178.00; // valor original
    double percentual = 15.0 / 100.0; // 15%
    double valor_final = valor + (percentual * valor);

    System.out.println("O valor final do produto é: " +
      valor_final);   

    // O resultado será 204,70

    System.exit(0);
  }
} 
Ex: 2 - Um produto, cujo valor original era de R$ 250,00, teve um desconto de 8%. Qual foi seu valor final? Veja o código em Java:
public class Estudos{
  public static void main(String args[]){
    double valor = 250.00; // valor original
    double percentual = 8.0 / 100.0; // 8%
    double valor_final = valor - (percentual * valor);

    System.out.println("O valor final do produto é: " +
      valor_final);   

    // O resultado será 230,00

    System.exit(0);
  }
} 

Ex: 3 - Em um concurso de perguntas e respostas, um jovem acertou 72 das 90 perguntas apresentadas. Qual foi a porcentagem de acertos? E a porcentagem de erros? Veja o código em Java:
public class Estudos{
  public static void main(String args[]){
    double perguntas = 90.0;
    double acertos = 72.0;

    System.out.println("Porcentagem de acertos: " +
      ((acertos / perguntas) * 100) + "%");

    System.out.println("Porcentagem de erros: " +
      (((perguntas - acertos) / perguntas) * 100) + "%");   

    // Os resultados serão 80% e 20%

    System.exit(0);
  }
}

Ex: 4 - Um aparelho de CD foi adquirido por R$ 300,00 e revendido por R$ 240,00. Qual foi a porcentagem de lucro na transação? Veja o código em Java:
public class Estudos{
  public static void main(String args[]){
    double v_ant = 300.0; // valor anterior
    double v_nov = 340.0; // valor novo
    double p_lucro = 0.0; // porcentagem de lucro

    while(v_ant + ((p_lucro / 100.0) * v_ant) < v_nov){
      p_lucro = p_lucro + 0.1;
    } 

    System.out.println("A porcentagem de lucro foi de: " +
      p_lucro + "%");   

    // O resultado será 13,39

    System.exit(0);
  }
} 

Ex: 5 - Uma loja repassa 5% do lucro a seus vendedores. Se um produto custa R$ 70,00, qual o valor em reais repassado a um determinado vendedor? Veja o código em Java:
public class Estudos{
  public static void main(String args[]){
    double valor = 70.0; // valor do produto
    double porcent = 5.0 / 100.0; // 5%  

    double comissao = porcent * valor;

    System.out.println("O valor repassado ao vendedor e: " +
      comissao); 

    // O resultado será 3,5

    System.exit(0);
  }
}

Fonte: http://www.arquivodecodigos.net/dicas/java-efetuando-calculos-de-porcentagem-em-java-1221.html

terça-feira, 25 de setembro de 2012

iReport/JasperReports 4.7.1 + Hibernate 4.7.1 java.lang.NoSuchFieldError: BOOLEAN


Solution (Testado)


Solution is very simple.
1) Download the whole (with source) jasper tar.gz file from JasperReports home site
2) Untar the file (let the location be called $JASPER_SOURCE)
3) vim $JASPER_SOURCE/src/net/sf/jasperreports/engine/query/JRHibernateQueryExecuter.java
4) Add the following line in the top import statements
import org.hibernate.type.StandardBasicTypes;
5) Now from line 71 onwards change all "Hibernate" to "StandardBasicTypes" (till the end of the static block, that is till 84th line)
6) Save and exit the editor
7) Copy the latest hibernate3.jar (3.6.x version) into "$JASPER_SOURCE/lib" location
8) Now do the following ant command from $JASPER_SOURCE location
ant jar
You will get the modified jar in lib/jasperreports-4.x.x.jar location. Use that jar for your project
--------------- OR ------------------- 
(Não testado)
Another solution is to use old hibernate3.jar file (version 3.0.x) with your project

segunda-feira, 17 de setembro de 2012

ORA-00918: coluna definida de maneira ambígua

Problema: nome da propriedade duplicado.


@DiscriminatorColumn(discriminatorType=DiscriminatorType.CHAR,length=1,name="TIPO_PROCESSO")
@SequenceGenerator(name="seq_abreprocesso", sequenceName="seq_abreprocesso", allocationSize=1)
public class AbreProcesso implements Serializable {

...

@Column(length=1,insertable=false,updatable=false)
protected String tipo_processo;

...
}

Solução: Deixar tudo em lowercase.


@DiscriminatorColumn(discriminatorType=DiscriminatorType.CHAR,length=1,name="tipo_processo")
@SequenceGenerator(name="seq_abreprocesso", sequenceName="seq_abreprocesso", allocationSize=1)
public class AbreProcesso implements Serializable {

...

@Column(length=1,insertable=false,updatable=false)
protected String tipo_processo;

...
}

segunda-feira, 3 de setembro de 2012

java.io.IOException: Acesso negado (Quartz)

Ao executar uma trigger agendada no Quartz, onde um arquivo TXT é criado e salvo na rede, ocorre o seguinte erro:


Informações: Illegal access: this web application instance has been stopped already.  Could not load org.quartz.core.JobRunShell.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1597)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
at org.quartz.impl.StdJobRunShellFactory.borrowJobRunShell(StdJobRunShellFactory.java:91)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:332)

Exception in thread "DefaultQuartzScheduler_QuartzSchedulerThread" java.lang.NoClassDefFoundError: org/quartz/core/JobRunShell
at org.quartz.impl.StdJobRunShellFactory.borrowJobRunShell(StdJobRunShellFactory.java:91)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:332)
Caused by: java.lang.ClassNotFoundException: org.quartz.core.JobRunShell
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
... 2 more
java.io.IOException: Acesso negado
at java.io.WinNTFileSystem.createFileExclusively(Native Method)
at java.io.File.createNewFile(Unknown Source)
at br.com.lpc.lpcsys.integracao.IntegracaoJbsCouro.GerarTxt(IntegracaoJbsCouro.java:46)
at br.com.lpc.lpcsys.quartz.JobIntegraBysoft.execute(JobIntegraBysoft.java:48)
at org.quartz.core.JobRunShell.run(JobRunShell.java:191)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:516)

Solucação:

Acesse a ferramenta (Configure TomCat) "C:\Program Files\Apache Software Foundation\Tomcat 7.0\bin\Tomcat7w.exe //ES//Tomcat7". Abra a guia (Log On) e informe uma conta com permissões suficientes no diretório onde o TXT será criado.

Ou no serviço: Painel de Controle > Ferramentas Administrativas > Serviços > Apache Tomcat.

quinta-feira, 30 de agosto de 2012

Oracle update com select



UPDATE PERMISSAO
SET
  PERMISSAO.SELECIONAR = 0,
  PERMISSAO.ALTERAR = 0,
  PERMISSAO.INCLUIR = 0,
  PERMISSAO.EXCLUIR = 0
WHERE
  PERMISSAO.TELA_ID = 99
AND
  (SELECT USUARIO.CLIENTE FROM USUARIO WHERE USUARIO.ID = PERMISSAO.USUARIO_ID) = 1;


segunda-feira, 27 de agosto de 2012

Substituir string por outra string no oracle.


Substituir string por outra string no oracle.

UPDATE USUARIO
  SET USUARIO.PATH_FOTO =  REPLACE( USUARIO.PATH_FOTO ,'/Sistema/','/sistema/')

Altera de /Sistema/ para /sistema/.

Ex: /Sistema/fotos/
Altera para: /sistema/fotos/

sexta-feira, 24 de agosto de 2012

java.lang.NullPointerException java.lang.Class.isAssignableFrom(Native Method)


Erro: Ao clicar no botão salvar.
java.lang.NullPointerException java.lang.Class.isAssignableFrom(Native Method)

Local do problema:
<h:commandButton
 actionListener="#{contatoMB.save(tabHawb)}"
 value="Salvar"/>

Solução:
<h:commandButton
 actionListener="#{contatoMB.save('tabHawb')}"
 value="Salvar"/>

segunda-feira, 20 de agosto de 2012

Tomcat 7 + SSL (Windows)


1) Criar o arquivo keystore:

Em %JAVA_HOME%/bin execute o seguinte comando:

keytool -genkey -alias meuCertificado -keyalg DSA -keypass senha -storepass senha -keystore C:/certificados/meuCertificado.jks -dname "cn=empresa, ou=area, o=grupoDeTrabalho, l=Cidade, S=Estado, c=Pais" -validity 365

2)Configurar o arquivo server.xml do TomCat:

Localize a seguinte declaração:

<!--<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" />-->

Descomente e altere conforme abaixo:

Connector SSLEnabled="true" acceptCount="100" clientAuth="false"    disableUploadTimeout="true" enableLookups="false" maxThreads="25"    port="8443" keystoreFile="C:\certificados\meuCertificado.jks" keystorePass="senha"    protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"    secure="true" sslProtocol="TLS" />

3)Testando:
Acesse https://localhost:8443.

4)Configurar a aplicação para usar SSL:

Adicione no web.xml

<security-constraint>  
  <web-resource-collection>    
    <web-resource-name>securedapp</web-resource-name>      
    <url-pattern>/*</url-pattern>  //Ativar SSL em todas as páginas
    <url-pattern>/login.jsf</url-pattern> // Ativar SSL em páginas específicas
    <url-pattern>/cadastro/*</url-pattern>  //Ativar SSL em pastas
  </web-resource-collection>  
  <user-data-constraint>      
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>  
  </user-data-constraint>
</security-constraint>

Para desativar mude o CONFIDENTIAL para NONE.

quinta-feira, 16 de agosto de 2012

Hibernate 4.1.5 + TomCat 7 + JNDI Datasource + Oracle 10ge



<!-- A configuração abaixo deve ser adicionada ao context.xml do diretório conf do tomcat! -->
<Resource name="jdbc/testeDB"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="admin"
password="admin"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@192.168.0.9:1521:XE"
removeAbandoned="true"
removeAbandonedTimeout="60"
logAbandoned="true"/>

OBS: Copiar ojdbc14.jar para o diretório lib do TomCat.

 <!-- Adicionar no Web.xml-->
 <resource-ref>
  <description>DataSource testeDB</description>
  <res-ref-name>jdbc/testeDB</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
 </resource-ref>


<!-- hibernate.cgf.xml -->
<!-- Configuração com Data Source -->
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.jdbc.use_streams_for_binary=">true</property>
<property name="hibernate.connection.datasource">java:/comp/env/jdbc/testeDB</property>
<property name="current_session_context_class">thread</property>
 
<!-- Configuração sem Data Source
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@192.168.0.9:1521:XE</property>
<property name="hibernate.connection.username">admin</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.password">admin</property>
<property name="hibernate.jdbc.use_streams_for_binary=">true</property>
 -->

<!-- Pool de Conexões - C3P0 
        Colocar JARs na pasta lib do TomCat
Não é necessário quando a conexão é feita através de um Data Source. Nesse caso, o poll deve ser configurado no context.xml

  <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.org.c3p0.min_size">3</property>
<property name="hibernate.org.c3p0.max_size">30</property>
<property name="hibernate.org.c3p0.timeout">10</property>
<property name="hibernate.org.c3p0.max_statements">0</property>
<property name="hibernate.org.c3p0.idle_test_period">30</property>
<property name="hibernate.org.c3p0.acquire_increment">5</property>
-->

terça-feira, 7 de agosto de 2012

Tomcat convertendo campos null para zero


Adicionar a seguinte linha em (VM Arguments) do Tomcat.

-Dorg.apache.el.parser.COERCE_TO_ZERO=false

Fonte: http://balusc.blogspot.com.br/2008/01/jsf-tutorial-with-eclipse-and-tomcat.html#IntegrateTomcatInEclipse

terça-feira, 31 de julho de 2012

Abrir em nova janela com h:commandButton


<h:commandButton action="#{bean.imprimir()}" value="imprimir"
onclick="this.form.target='_blank'">

Fazer JSF passar parâmetros via GET através do ManagedBean

Útil quando é necessário passar parâmetros via GET porém, os parâmetros ainda não estão no ManagedBean.


View


<h:commandButton action="#{flpImportacaoGrupoMB.imprimir()}" value="imprimir"
onclick="this.form.target='_blank'">

Faz com que seja aberta uma nova janela do navegador. Dessa forma você pode ter um form com botões abrindo na mesma janela ou em outra.

ManagedBean

public String imprimir(){
   return "relFlpParametrizadoGrupo?faces-redirect=true&grupo="+grupoSelecionado
+"&campo="+campoDataSelecionado
+"&tipoProcesso="+tipoProcessoSelecionado
+"&dataI="+getDataInicioFmt()
+"&dataF="+getDataFimFmt();
}

Converte de POST para GET.

quarta-feira, 25 de julho de 2012

Passar parâmetro via get no jsf 2

Página 1


<h:link target="_blank"
outcome="/pagina2" 
style="height:0px;width:0px;border-style:none;margin:0px;padding:0px;">
       <h:graphicImage value="/imagens/ImagensUtilizadas/16x16/doc6.png" />
       <f:param name="id" value="#{usuarioMB.id}"/>
</h:link>                              

Página 2

<ui:composition template="/templates/relatorio.xhtml">
       <f:metadata> 
           <f:viewParam name="id" value="#{usuarioMB.id}" />
       </f:metadata>

       <h:head>
             <meta http-equiv="content-Type" content="text/html; charset=utf-8" />
       </h:head>
       <ui:define name="centro">
             <h:form>
                    <h:outputText value="Id:" />
                    <h:outputText value="#{usuarioMB.usuario.id}"/>
                    <h:outputText value="Nome:"/>
                    <h:outputText value="#{usuarioMB.usuario.nome}"/>

             </h:form>
       </ui:define>
...

Recuperar dados do banco ao abrir a página 2:

Criar método no managed bean. 
@PostConstruct
public void carregar(){
   String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
            
   if(id != null && !id.equals("")){
      dao = new Dao<Usuario>(HibernateUtil.getSession(),  Usuario .class);
      usuariodao.get(Integer.parseInt(id) );
   }
}


sexta-feira, 20 de julho de 2012

java.lang.IllegalStateException: Cannot serialize a session while connected

Problema:
java.lang.IllegalStateException: Cannot serialize a session while connected

Local do erro (JSF):
valida.validaNavio(processoMB.processo.navio_id)

Causa do erro (Tipo do argumento incorreto):

public String validaNavio(String codigo){
     dao.loadByField("id", codigo);
}

Solução:
public String validaNavio(Integer codigo){
     dao.loadByField("id", codigo);
}

quinta-feira, 19 de julho de 2012

javax.faces.application.ViewExpiredException: viewId:/index.jsf - A exibição de /index.jsf não pôde ser restaurada.


javax.faces.application.ViewExpiredException: viewId:/index.jsf - A exibição de /index.jsf não pôde ser restaurada.

Para resolver, adicione as linhas abaixo no Web.xml

 <context-param>
  <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  <param-value>client</param-value>
 </context-param>

sexta-feira, 29 de junho de 2012

@OneToOne com chave compartilhada


@Entity@DiscriminatorValue(value="S")@SequenceGenerator(name="seq_abreprocesso", sequenceName="seq_abreprocesso", allocationSize=1)public class ProcessoSc extends AbreProcesso implements Serializable{ @OneToOne(cascade = CascadeType.ALL) @PrimaryKeyJoinColumn(name="id") private Sc sc;
public Sc getSc() { return sc; }
public void setSc(Sc sc) { this.sc = sc; }
@Override public int hashCode() { return super.hashCode(); }
@Override public boolean equals(Object obj) { return super.equals(obj); } }


.public class Sc implements Serializable{ @Id @GeneratedValue(generator="fk_abreprocesso") @org.hibernate.annotations.GenericGenerator(name="fk_abreprocesso",strategy="foreign",parameters=@Parameter(name="property", value="processoSc" private Integer abreprocesso_id; @OneToOne(mappedBy="sc") private ProcessoSc processoSc;
        Get/Set...}



terça-feira, 26 de junho de 2012

Diferença entre datas


01.package br.com.furutani;
02.import java.util.Calendar;
03./**
04.* Calcula a diferença em dias entre a data de hoje e o dia 10/FEV/2008
05.* @author Roberto Jundi
06.*/
07.public class Calendario {
08. 
09.public static void main(String[] args) {
10.// Data inicial
11.Calendar dataInicio = Calendar.getInstance();
12.// Atribui a data de 10/FEV/2008
13.dataInicio.set(2008, Calendar.FEBRUARY, 10);
14. 
15.// Data de hoje
16.Calendar dataFinal = Calendar.getInstance();
17. 
18.// Calcula a diferença entre hoje e da data de inicio
19.long diferenca = dataFinal.getTimeInMillis() -
20.dataInicio.getTimeInMillis();
21. 
22.// Quantidade de milissegundos em um dia
23.int tempoDia = 1000 60 60 24;
24. 
25.long diasDiferenca = diferenca / tempoDia;
26. 
27.System.out.println("Entre a data inicial e final são " +
28.diasDiferenca + " dias de diferença.");
29. 
30.}
31. 
32.}

Fonte: http://www.furutani.com.br/2009/02/calculo-da-diferenca-entre-datas-em-java/