Usando JPA - com nome de tabelas em maiusculo

07/04/2009

como faço para usar mapeamento de tabelas em maiusculo, no JPA ou Hibernate tem como configurar para se case sensitive.

Códigos:


CREATE TABLE "agr"."APRCPRD" (
  "PRPRD_UF" VARCHAR(2) NOT NULL,
  "PRPRD_EMP_GRU" INTEGER NOT NULL,
  "PRPRD_TAB_PRC" INTEGER NOT NULL,
  "PRPRD_PRAZO" INTEGER NOT NULL,
  "PRPRD_QUANT" INTEGER NOT NULL,
  "PRPRD_PRECO" NUMERIC(10,2) NOT NULL,
  CONSTRAINT "APRCPRD_idx" PRIMARY KEY("PRPRD_UF", "PRPRD_EMP_GRU", "PRPRD_TAB_PRC", "PRPRD_PRAZO", "PRPRD_QUANT"),
  CONSTRAINT "APRCPRD_MARCA_fk" FOREIGN KEY ("PRPRD_EMP_GRU", "PRPRD_TAB_PRC")
    REFERENCES "public"."UPRODTAB"("PRT_EMP_GRU", "PRT_CODIGO")
    ON DELETE NO ACTION
    ON UPDATE CASCADE
    NOT DEFERRABLE
) WITH OIDS;

O banco que uso é postgres. O esquema ta configurado para padrão, não te preocupe com ESQUEMA

Já coloquei desta forma e funcionou @Table(name = "\"APRCPRD\""), mas o problema é quando uso join em outras tabela, como neste exemplo:

@Table(name = "UESTADO".....
....
@JoinColumn(name = "UF_PAIS", referencedColumnName = "PAI_CODIGO")
@ManyToOne
private Upaises ufPais;


@Table(name = "UPAISES".....
....
@Id
@Basic(optional = false)
@Column(name = "PAI_CODIGO", nullable = false)
private Integer paiCodigo;



¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨

/*
 * <<<<<<<<<<< Classe Mapeamento da Tabela APRCPRD >>>>>>>>>>>>
 *
 */
package br.com.erp.jpa;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;

/**
 *
 * @author JoaoRocha
 */
@Entity(name = "PrecoProduto")
@Table(name = "APRCPRD")
public class PrecoProduto implements Serializable {

    private static final long serialVersionUID = 1L;
    @EmbeddedId
    PrecoProdutoPK id;
    @Column(nullable = false, name = "PRPRD_PRECO")
    Double preco;

    public PrecoProduto() {
    }

    public PrecoProduto(PrecoProdutoPK id, Double preco) {
        this.id = id;
        this.preco = preco;
    }

    public PrecoProdutoPK getId() {
        return id;
    }

    public void setId(PrecoProdutoPK id) {
        this.id = id;
    }

    public Double getPreco() {
        return preco;
    }

    public void setPreco(Double preco) {
        this.preco = preco;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final PrecoProduto other = (PrecoProduto) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 17 * hash + (this.id != null ? this.id.hashCode() : 0);
        return hash;
    }
}
¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨

/*                  <<<<<<<<<<< Classe da chave composta >>>>>>>>>>>>>

package br.com.erp.jpa;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;

/**
 *
 * @author JoaoRocha
 */
@Embeddable()
public class PrecoProdutoPK implements Serializable {

    private static final long serialVersionUID = 1L;
    @Column(nullable=false,name="PRPRD_UF")
    String uf;
    @Column(nullable=false,name="PRPRD_EMP_GRU")
    Integer emp_gru;
    @Column(nullable=false,name="PRPRD_TAB_PRC")
    Integer tab_prc;
    @Column(nullable=false,name="PRPRD_PRAZO")
    Integer prazo;
    @Column(nullable=false,name="PRPRD_QUANT")
    Integer quant;

    public PrecoProdutoPK() {
    }

    public PrecoProdutoPK(String uf, Integer emp_gru, Integer tab_prc, Integer prazo, Integer quant) {
        this.uf = uf;
        this.emp_gru = emp_gru;
        this.tab_prc = tab_prc;
        this.prazo = prazo;
        this.quant = quant;
    }

    public Integer getEmp_gru() {
        return emp_gru;
    }

    public void setEmp_gru(Integer emp_gru) {
        this.emp_gru = emp_gru;
    }

    public Integer getPrazo() {
        return prazo;
    }

    public void setPrazo(Integer prazo) {
        this.prazo = prazo;
    }

    public Integer getQuant() {
        return quant;
    }

    public void setQuant(Integer quant) {
        this.quant = quant;
    }

    public Integer getTab_prc() {
        return tab_prc;
    }

    public void setTab_prc(Integer tab_prc) {
        this.tab_prc = tab_prc;
    }

    public String getUf() {
        return uf;
    }

    public void setUf(String uf) {
        this.uf = uf;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final PrecoProdutoPK other = (PrecoProdutoPK) obj;
        if (this.uf != other.uf && (this.uf == null || !this.uf.equals(other.uf))) {
            return false;
        }
        if (this.emp_gru != other.emp_gru && (this.emp_gru == null || !this.emp_gru.equals(other.emp_gru))) {
            return false;
        }
        if (this.tab_prc != other.tab_prc && (this.tab_prc == null || !this.tab_prc.equals(other.tab_prc))) {
            return false;
        }
        if (this.prazo != other.prazo && (this.prazo == null || !this.prazo.equals(other.prazo))) {
            return false;
        }
        if (this.quant != other.quant && (this.quant == null || !this.quant.equals(other.quant))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 61 * hash + (this.uf != null ? this.uf.hashCode() : 0);
        hash = 61 * hash + (this.emp_gru != null ? this.emp_gru.hashCode() : 0);
        hash = 61 * hash + (this.tab_prc != null ? this.tab_prc.hashCode() : 0);
        hash = 61 * hash + (this.prazo != null ? this.prazo.hashCode() : 0);
        hash = 61 * hash + (this.quant != null ? this.quant.hashCode() : 0);
        return hash;
    }
      
   
}


MENSAGEM DE ERRO:


Hibernate: select precoprodu0_.PRPRD_EMP_GRU as PRPRD1_0_0_, precoprodu0_.PRPRD_PRAZO as PRPRD2_0_0_, precoprodu0_.PRPRD_QUANT as PRPRD3_0_0_, precoprodu0_.PRPRD_TAB_PRC as PRPRD4_0_0_, precoprodu0_.PRPRD_UF as PRPRD5_0_0_, precoprodu0_.PRPRD_PRECO as PRPRD6_0_0_ from APRCPRD precoprodu0_ where precoprodu0_.PRPRD_EMP_GRU=? and precoprodu0_.PRPRD_PRAZO=? and precoprodu0_.PRPRD_QUANT=? and precoprodu0_.PRPRD_TAB_PRC=? and precoprodu0_.PRPRD_UF=?
07/04/2009 09:01:53 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: 42P01
07/04/2009 09:01:53 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERRO: relação "aprcprd" não existe                    <------- Observe
07/04/2009 09:01:53 org.hibernate.event.def.DefaultLoadEventListener onLoad
INFO: Error performing load command
org.hibernate.exception.SQLGrammarException: could not load an entity: [br.com.erp.jpa.PrecoProduto#component[emp_gru,prazo,quant,tab_prc,uf]{uf=RS, quant=98, prazo=6, emp_gru=1, tab_prc=1}]
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.loader.Loader.loadEntity(Loader.java:1874)
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
        at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3044)
        at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:395)
        at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:375)
        at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139)
        at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:195)
        at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103)
        at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
        at org.hibernate.impl.SessionImpl.get(SessionImpl.java:815)
        at org.hibernate.impl.SessionImpl.get(SessionImpl.java:808)
        at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:182)
        at br.com.erp.jpa.PrecoProdutoDAO.consultar(PrecoProdutoDAO.java:34)
        at br.com.erp.jpa.PrecoProdutoDAO.main(PrecoProdutoDAO.java:47)
Caused by: org.postgresql.util.PSQLException: ERRO: relação "aprcprd" não existe
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)
        at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
        at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
        at org.hibernate.loader.Loader.doQuery(Loader.java:674)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
        at org.hibernate.loader.Loader.loadEntity(Loader.java:1860)



Pirahy Alimentos

Pirahy Alimentos

Curtidas 0

Respostas

Henrique Weissmann

Henrique Weissmann

07/04/2009

Olá Pirahy,

na realidade, esta configuração vai muito mais pro seu gerenciador de banco de dados do que para o JPA.
No caso, se o banco de dados estiver em um servidor Linux (ou qualquer outro sistema operacional que faça diferença entre maiúsculas e minúsculas), haverá diferença, porque os arquivos do SGBD armazenados só serão identificados desta maneira.

A sequencia do que ocorre é a seguinte: alguém faz uma consulta ao SGBD.
SGBD busca arquivos relacionados fazendo uma chamada ao Sistema Operacional.
Sistema Operacional busca os arquivos.
Se for case sensitive, não os encontrará, caso contrário, não haverá diferença.
Um erro é retornado ao SGBD, que retornará o erro ao usuário.

No caso do Windows, no entanto, o mesmo não ocorre, pois o sistema operacional não faz esta diferenciação.

No caso, eu não sei qual a configuração do PostgreSQL para tal.
GOSTEI 0
Pirahy Alimentos

Pirahy Alimentos

07/04/2009

No postgres eu ja criei tudo em maiusculo as tabela, e não tem como mudar. Eu tenho que saber como eu faço para configurar ou colocar em maiusculo no JPA ou Hibernate.... se não tem preciso saber como deixo o codigo para que ele não de erro de mapeamento de colunas referenciadas pela anotação joinColumn tem como?
GOSTEI 0
Pirahy Alimentos

Pirahy Alimentos

07/04/2009

Por obsequio, ainda não consegui usar anotação joincolumn quando as colunas da tabela esta em maiúscula....
GOSTEI 0
Dyego Carmo

Dyego Carmo

07/04/2009

Qual a versão do hibernate, qual a versao do postgresql  e do jdbc ?
GOSTEI 0
Pirahy Alimentos

Pirahy Alimentos

07/04/2009

Postgresql = 8.2 testei com a 8.3 tambem Hibernate = 3.4.0 Jdbc = 8.3.603 jdbc4
GOSTEI 0
Dyego Carmo

Dyego Carmo

07/04/2009

Se voce colocar tudo para minusculo as tabelas , funciona belezinha ? Ou dá o mesmo erro ?
GOSTEI 0
Dyego Carmo

Dyego Carmo

07/04/2009

Seguinte,

Esse problema não é do JPA , é do Hibernate...

veja aqui:

http://opensource.atlassian.com/projects/hibernate/browse/HHH-1994
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2942;jsessionid=B9F61B2B7190DE113074C1774BBE8083

Existem pedidos para corrigir este bug... e não tem previsão para tal...

Fiz minhas pesquisas... mas até agora todos respondem a mesma coisa, CASE SENSITIVE em tabelas pelo hibernate no postgres ainda não é permitido.

Espero ter ajudado !

GOSTEI 0
Devmedia

Devmedia

07/04/2009

Senhor,
a resposta do consultor sanou sua dúvida? Podemos encerrar o chamado?
GOSTEI 0
Pirahy Alimentos

Pirahy Alimentos

07/04/2009

sim, foi suficiente
GOSTEI 0
POSTAR