Boa tarde,
estou trabalhando em uma aplicação que precisa mapear uma tabela no db2 e executar uma consulta, a aplicação sobe sem erros porém ao executar a NamedQuery
cai em uma exceção e a mensagem é null, estou apanhando a um bom tempo e não consegui encontrar a causa:
Tabela do banco:
CREATE TABLE QUOTECRM0
(
CUNO char(7) NOT NULL,
RFDCNO char(10) NOT NULL,
SEQ bigint NOT NULL,
DOCSU char(1) NOT NULL,
STNO char(2) NOT NULL,
CUNM char(56) NOT NULL,
FRDST char(40) NOT NULL,
TODST char(40) NOT NULL,
MAILDST char(50) NOT NULL,
PHNOW char(15) NOT NULL,
CRIACAO date NOT NULL,
EXPIRACAO date NOT NULL,
LSTMNT char(10) for bit data NOT NULL,
USPFID char(3) NOT NULL,
USUARIO char(60) NOT NULL,
TOTSEL decimal(13,2) NOT NULL,
VLRIPI decimal(13,2) NOT NULL,
ICMSUB decimal(13,2) NOT NULL,
ESTIMADO decimal(13,2) NOT NULL,
NRETCAT bigint NOT NULL,
ITENS long varchar NOT NULL
)
;
CREATE UNIQUE INDEX QUOTECRM0L ON QUOTECRM0 ( CUNO, RFDCNO, SEQ )
;
Como a não existe PK, fiz o mapeamento como chave composta:
Classe que representa a chave:
package br.com.pesa.dbs.entidades;
import java.io.Serializable;
import java.math.BigInteger;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Table;
@Embeddable
public class PorpostaPK implements Serializable{
@Column
private String CUNO;
@Column
private String RFDCNO;
@Column
private BigInteger SEQ;
public PorpostaPK(){
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof PorpostaPK)){
PorpostaPK porpostaPK = (PorpostaPK) obj;
if(!porpostaPK.getCUNO().equals(CUNO)){
return false;
}
if(!porpostaPK.getRFDCNO().equals(RFDCNO)){
return false;
}
if(!porpostaPK.getSEQ().equals(SEQ)){
return false;
}
return true;
}
return false;
}
@Override
public int hashCode() {
return CUNO.hashCode() + RFDCNO.hashCode() +SEQ.hashCode();
}
public String getCUNO() {
return CUNO;
}
public void setCUNO(String cUNO) {
CUNO = cUNO;
}
public String getRFDCNO() {
return RFDCNO;
}
public void setRFDCNO(String rFDCNO) {
RFDCNO = rFDCNO;
}
public BigInteger getSEQ() {
return SEQ;
}
public void setSEQ(BigInteger sEQ) {
SEQ = sEQ;
}
}
Mapeando a tabela: (com a query)
import java.io.Serializable;
import java.math.BigInteger;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
@Entity
@Table(name = "quotecrm0", schema = "pesa200arq")
@NamedQueries({
@NamedQuery(name = "Proposta.findProposta", query = "Select Pro.cunm from Proposta as Pro")})
public class Proposta implements Serializable{
/**
*
*/
@EmbeddedId
private PorpostaPK porpostaPK;
@Column(name = "STNO")
private String stno;
@Column(name = "CUNM")
private String cunm;
public PorpostaPK getPorpostaPK() {
return porpostaPK;
}
public void setPorpostaPK(PorpostaPK porpostaPK) {
this.porpostaPK = porpostaPK;
}
public String getStno() {
return stno;
}
public void setStno(String stno) {
this.stno = stno;
}
public String getCunm() {
return cunm;
}
public void setCunm(String cunm) {
this.cunm = cunm;
}
}
Veja como ficou o Data Source: db2-400-ds.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- ===================================================================== -->
<!-- -->
<!-- JBoss Server Configuration -->
<!-- -->
<!-- ===================================================================== -->
<!-- $Id: db2-400-ds.xml 71535 2008-04-01 07:05:03Z adrian@jboss.org $ -->
<!-- You need the jt400.jar that is delivered with IBM iSeries Access or the
OpenSource Project jtopen.
[systemname] Hostame of the iSeries
[schema] Default schema is needed so jboss could use metadat to test if the tables exists
-->
<datasources>
<local-tx-datasource>
<jndi-name>DB2400</jndi-name>
<connection-url>jdbc:as400://192.168.1.1;extended dynamic=true;package=jbpkg;package cache=true;package library=jboss;errors=full</connection-url>
<driver-class>com.ibm.as400.access.AS400JDBCDriver</driver-class>
<user-name>XXXX</user-name>
<password>XXXXXX</password>
<min-pool-size>1</min-pool-size>
<!-- sql to call when connection is created
<new-connection-sql>some arbitrary sql</new-connection-sql>
-->
<!-- sql to call on an existing pooled connection when it is obtained from pool
<check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
-->
<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
<metadata>
<type-mapping>DB2/400</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
E o Persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="DB2400DbsPesa" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:DB2400</jta-data-source>
<class>br.com.pesa.dbs.entidades.Proposta</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.dialect" value="org.hibernate.dialect.DB2400Dialect" />
<property name="hibernate.validator.autoregister_listeners" value="false" />
<property name="hibernate.validator.apply_to_ddl" value="false" />
<property name="hibernate.default_batch_fetch_size" value="50" />
</properties>
</persistence-unit>
</persistence>
Agora Instancio meu EJB e chamo a query:
import java.util.List;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.persistence.PersistenceException;
import javax.transaction.UserTransaction;
import br.com.pesa.beans.JPA.EntityRepositoryDBSPesaLocal;
import br.com.pesa.dbs.entidades.Proposta;
/**
* Session Bean implementation class PropostasDbs
*/
@Stateless(name = PropostasDbsLocal.EJB_NAME)
@TransactionManagement(TransactionManagementType.BEAN)
public class PropostasDbsBeans implements PropostasDbsLocal {
@EJB(name = EntityRepositoryDBSPesaLocal.EJB_NAME)
public static EntityRepositoryDBSPesaLocal entityRepositoryBeanDBS;
@Resource
private UserTransaction userTransaction;
public void testaJPA() throws Exception {
//Teste conexão hibernate
Proposta proposta = new Proposta();
try{
List<Proposta> propostas = getEntityRepositoryBeanDBS().findByNamedQuery("Proposta.findProposta"); //.findByNamedQuery("Proposta.findProposta");
} catch (Exception e) {
throw new Exception("Erro consulta: " + e.getMessage());
}
}
public static EntityRepositoryDBSPesaLocal getEntityRepositoryBeanDBS() {
return entityRepositoryBeanDBS;
}
public UserTransaction getUserTransaction() {
return userTransaction;
}
}
Neste ponto sempre cai no catch e retorna a mensagem de nulll, revisei diversas vezes o código, os pom.xml do mavem e estão ok com as bibliotecas…
Veja o Local do bean:
package br.com.pesa.integrador.beans.dbs;
import javax.ejb.Local;
@Local
public interface PropostasDbsLocal {
public static final String EJB_NAME = "propostasDbsBeans";
public void testaJPA() throws Exception;
}
Aqui esta minha pelaja que estame tirando um bom tempo, alguém passou por algo parecido?
Obrigado!!