PSQLException: ERRO: relação "bancos" não existe

14 respostas
D

Bom dia pessoal! Alguém já passou por esse erro?

run: log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version). log4j:WARN Please initialize the log4j system properly. Hibernate: insert into BANCOS (NOME) values (?) org.hibernate.exception.SQLGrammarException: could not insert: [br.com.audcont.conversor.to.Banco] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:64) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2186) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2666) at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321) at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:534) at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:526) at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:522) at br.com.audcont.conversor.dao.Dao.inserirOuAtualizar(Dao.java:18) at br.com.audcont.conversor.apresentacao.teste.main(teste.java:22) Caused by: org.postgresql.util.PSQLException: ERRO: relação "bancos" não existe at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1608) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1343) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:194) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:304) at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:57) ... 16 more Exception in thread "main" java.lang.RuntimeException at br.com.audcont.conversor.dao.Dao.inserirOuAtualizar(Dao.java:25) at br.com.audcont.conversor.apresentacao.teste.main(teste.java:22) Java Result: 1

Alguém poderia me ajudar?
Um abraço!

14 Respostas

G

Confere como está no seu hibernate.properties o nome do banco:

hibernate.dialect org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.driver_class org.postgresql.Driver
hibernate.connection.url jdbc:postgresql://localhost/banco
hibernate.connection.username postgres
hibernate.connection.password suasenha

Veja lá se está BANCO, Banco ou banco, têm que coincidir com o nome do banco que está lá no Postgre, maiúsculas e minúsculas fazem diferença.

D

Estou utilizando o banco de dados postgres. O nome do banco é sistemas. Esse "banco" que aparece ai no erro é o nome da tabela.

Configuração do Hibernate
package br.com.audcont.conversor.dao;

import br.com.audcont.conversor.to.Banco;
import br.com.audcont.conversor.to.LancamentoImportado;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtility {

    private static SessionFactory factory;
    private static AnnotationConfiguration aC;

    static {
        try {
            aC = new AnnotationConfiguration();
            aC.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
            aC.setProperty("hibernate.connection.driver_class", "org.postgresql.Driver");
            aC.setProperty("hibernate.connection.url", "jdbc:postgresql://localhost/sistemas");
            aC.setProperty("hibernate.connection.username", "postgres");
            aC.setProperty("hibernate.connection.password", "postgres");
            aC.setProperty("hibernate.show_sql", "true");
            aC.setProperty("hibernate.format_sql", "true");
            aC.setProperty("hibernate.c3p0.acquire_increment", "1");
            aC.setProperty("hibernate.c3p0.idle_test_period", "100");
            aC.setProperty("hibernate.c3p0.min_size", "10");
            aC.setProperty("hibernate.c3p0.max_size", "100");
            aC.setProperty("hibernate.c3p0.max_statements", "0");
            aC.setProperty("hibernate.c3p0.timeout", "100");
            aC.addAnnotatedClass(Banco.class);
            aC.addAnnotatedClass(LancamentoImportado.class);
            factory = aC.buildSessionFactory();
        } catch (Exception e) {
            e.printStackTrace();
            factory = null;
        }
    }

    public static Session getSession() {
        return factory.openSession();
    }
}
F

Isso pode te ajudar:

http://www.guj.com.br/posts/list/196840.java

G

Que tipo de relacionamento vc fez entre as classes? Como vc está persistindo isso?

D

Abaixo está a classe das duas classes.

Banco
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.audcont.conversor.to;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 *
 * @author Dassayev Barbosa
 */
@Entity
@Table(name = "BANCOS", schema="carajas")
@NamedQueries({
    @NamedQuery(name = "Banco.findAll", query = "SELECT b FROM Banco b"),
    @NamedQuery(name = "Banco.findById", query = "SELECT b FROM Banco b WHERE b.id = :id"),
    @NamedQuery(name = "Banco.findByNome", query = "SELECT b FROM Banco b WHERE b.nome = :nome")})
public class Banco implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID")
    private Long id;
    @Basic(optional = false)
    @Column(name = "NOME")
    private String nome;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idBanco")
    private List<LancamentoImportado> lancamentoImportadoList;

    public Banco() {
    }

    public Banco(Long id) {
        this.id = id;
    }

    public Banco(Long id, String nome) {
        this.id = id;
        this.nome = nome;
    }

    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 List<LancamentoImportado> getLancamentoImportadoList() {
        return lancamentoImportadoList;
    }

    public void setLancamentoImportadoList(List<LancamentoImportado> lancamentoImportadoList) {
        this.lancamentoImportadoList = lancamentoImportadoList;
    }

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

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Banco)) {
            return false;
        }
        Banco other = (Banco) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.audcont.conversor.to.Banco[id=" + id + "]";
    }

}
LancamentoImportado
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.audcont.conversor.to;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 *
 * @author Angelika
 */
@Entity
@Table(name = "LANCAMENTOS_IMPORTADOS", schema="carajas")
@NamedQueries({
    @NamedQuery(name = "LancamentoImportado.findAll", query = "SELECT l FROM LancamentoImportado l"),
    @NamedQuery(name = "LancamentoImportado.findById", query = "SELECT l FROM LancamentoImportado l WHERE l.id = :id"),
    @NamedQuery(name = "LancamentoImportado.findByData", query = "SELECT l FROM LancamentoImportado l WHERE l.data = :data"),
    @NamedQuery(name = "LancamentoImportado.findByValor", query = "SELECT l FROM LancamentoImportado l WHERE l.valor = :valor"),
    @NamedQuery(name = "LancamentoImportado.findByNumeroCheque", query = "SELECT l FROM LancamentoImportado l WHERE l.numeroCheque = :numeroCheque"),
    @NamedQuery(name = "LancamentoImportado.findByHistorico", query = "SELECT l FROM LancamentoImportado l WHERE l.historico = :historico")})
public class LancamentoImportado implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID")
    private Long id;
    @Column(name = "DATA")
    @Temporal(TemporalType.DATE)
    private Date data;
    @Column(name = "VALOR")
    private BigDecimal valor;
    @Column(name = "NUMERO_CHEQUE")
    private String numeroCheque;
    @Column(name = "HISTORICO")
    private String historico;
    @JoinColumn(name = "ID_BANCO", referencedColumnName = "ID")
    @ManyToOne(optional = false)
    private Banco idBanco;

    public LancamentoImportado() {
    }

    public LancamentoImportado(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }

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

    public Date getData() {
        return data;
    }

    public void setData(Date data) {
        this.data = data;
    }

    public BigDecimal getValor() {
        return valor;
    }

    public void setValor(BigDecimal valor) {
        this.valor = valor;
    }

    public String getNumeroCheque() {
        return numeroCheque;
    }

    public void setNumeroCheque(String numeroCheque) {
        this.numeroCheque = numeroCheque;
    }

    public String getHistorico() {
        return historico;
    }

    public void setHistorico(String historico) {
        this.historico = historico;
    }

    public Banco getIdBanco() {
        return idBanco;
    }

    public void setIdBanco(Banco idBanco) {
        this.idBanco = idBanco;
    }

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

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof LancamentoImportado)) {
            return false;
        }
        LancamentoImportado other = (LancamentoImportado) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.audcont.conversor.to.LancamentoImportado[id=" + id + "]";
    }

}
G

É assim:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "banco")

O mappedBy é o nome da classe.
Tente de novo.

obs: pra ficar completo poderia ficar assim:

@OneToMany(targetEntity=LancamentoImportado.class ,cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "banco",orphanRemoval=true)
D

Fazendo a alteração solicitada o seguinte erro foi gerado:

run: log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version). log4j:WARN Please initialize the log4j system properly. org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: br.com.audcont.conversor.to.LancamentoImportado.Banco in br.com.audcont.conversor.to.Banco.lancamentoImportadoList at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:578) at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:543) at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:66) at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1163) at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:329) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1319) at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867) at br.com.audcont.conversor.dao.HibernateUtility.<clinit>(HibernateUtility.java:34) at br.com.audcont.conversor.dao.Dao.listar(Dao.java:34) at br.com.audcont.conversor.dao.BancoDAO.getBancos(BancoDAO.java:21) at br.com.audcont.conversor.apresentacao.teste.main(teste.java:22) Exception in thread "main" java.lang.NullPointerException at br.com.audcont.conversor.dao.HibernateUtility.getSession(HibernateUtility.java:42) at br.com.audcont.conversor.dao.Dao.listar(Dao.java:34) at br.com.audcont.conversor.dao.BancoDAO.getBancos(BancoDAO.java:21) at br.com.audcont.conversor.apresentacao.teste.main(teste.java:22) Java Result: 1

Acho que o problema não era isso. O MappedBy é o nome da campo da outra classe.

G

O problema era esse, o mappedBy é o nome da classe e não da ID da classe, deixe a classe Banco com a anotação que postei:

@OneToMany(targetEntity=LancamentoImportado.class ,cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "banco",orphanRemoval=true)	
public List<LancamentoImportado> lancamentoImpotados;
// getters, setters e construtor preenchido
public Banco {
}

E na LancamentoImportado:

@ManyToOne
	private Banco banco;
//getters, setters e construtor preenchido
public LancamentoImportado {
}

Veja se resolve.

D

Não deu certo! Já to doido aqui!!! O que será que pode ser isso?

G

Tira o schema=“carajas” das classes, no Postgre deve estar a “public”.

R

E ai blz…

Seguinte semana passada eu estava desenvolvendo um projeto usando do DB postgresql, só que eu tive grandes problemas com ele sobre como manter o Case sensitive do banco.

Criava todas as tabelas mas na hora de inserir, não inseria de jeito maneira. foi aqui que resolvi migrar para o MySQL.

Mas tente manter todas as tabelas e seus atributos minúsculos, usando o PostgreSQL.

att

Romildo Jozue Paiter

D

Era exatamente isso! Coloquei tudo para minúsculo e funcionou!
Obrigado a todos!!! :smiley:
Um abraço!

R

Blz, Dassayev.

Pois é, o postgresql tem isso, é algo a respeito de estar ativado o Case Sensitive. não pesquisei como desabilitar isso, e se se interessar passa o procedimento que você fez.

Se ficou tudo funcionado, com tudo minusculo, já é alguma coisa.

Falow, bom FDS.

att

Romildo Paiter

D

O procedimento que eu fiz foi renomear as tables e os campos para minúsculo e refazer o mapeamento do hibernate, pois o nome das tables e dos campos estavam todos em maiúsculo no mapeamento (e no banco também). Fiz isso e deu certo. :smiley:
Também vou dar uma pesquisada em como desabilitar o case sensitive. Qualquer coisa eu posto aqui.

Brigadão Romildo. Bom final de semana.

Um abraço!

Criado 14 de maio de 2010
Ultima resposta 5 de jun. de 2010
Respostas 14
Participantes 4