1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

SQLException hibernate chave estrangeira

Olá , sou novo na área e NÃO estou conseguindo gravar minha tabela Cliente. Cria a tabela Categoria, Filme e Midia, mas não cria a tabela Cliente . Uso o Postgres c/ Hibernate. É um exercício didático q estou fazendo de uma Locadora onde tem Categoria.java, Cliente.java, Endereco.java, Filme.java, Locacao.java, Midia.java.

Minha hibernate_sequecen

CREATE SEQUENCE hibernate_sequence
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE hibernate_sequence
  OWNER TO postgres;

hibernate.cfg.xml

<hibernate-configuration>
    <session-factory>
        <!-- Configuração da conexão com o banco MySQL e dialeto -->
        <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="connection.driver_class">org.postgresql.Driver</property>
        <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/locadora</property>
        <property name="connection.username">postgres</property>
        <property name="connection.password">postgres</property>
        <property name="hibernate.hbm2ddl.auto" >update</property>
        <!-- Usando as configurações do C3PO para pool de conexões -->
        <property name="c3po.min_size">5</property>
        <property name="c3po.max_size">20</property>
        <property name="c3po.timeout">300</property>
        <property name="c3po.max_statements">50</property>
        <property name="c3po.idle_test_period">3000</property>
        <!-- Configurações de debug -->
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <!--<property name="generate_statistics">true</property>-->
        <property name="use_sql_comments">true</property>
        <!-- Mapeando classes -->
        <property name="current_session_context_class">thread</property>
        <mapping class="model.Categoria"/>
        <mapping class="model.Cliente"/>
        <mapping class="model.Endereco"/>
        <mapping class="model.Filme"/>
        <mapping class="model.Locacao"/>
        <mapping class="model.Midia"/>
    </session-factory>
</hibernate-configuration>

Cliente.java

@Entity
public class Cliente implements Serializable{
    private static final long serialVersionUID = -5997202844258223199L;
    @Id
    @GeneratedValue
    private long id;
    private String nome;
    private String telefone;
    private String email;
    @OneToOne(cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn(name = "id_cliente")
    private Endereco endereco;
    @OneToMany(mappedBy = "cliente")
    private List<Locacao> locacoes;
    //Getters and Setters

ClienteDAO.java

public class ClienteDAO {
    private Session sessao;
    private Transaction transacao;

    public void salvar(Cliente c) {
        try {
            this.sessao = HibernateUtil.getSessionFactory().getCurrentSession();
            this.transacao = this.sessao.beginTransaction();
            this.sessao.save(c);
            this.transacao.commit();
        } catch (HibernateException e) {
            System.out.println("Nao foi possível inserir o Cliente. Erro: " + e.getMessage());
        } finally {
            try {
                if (this.sessao.isOpen()) {
                    this.sessao.close();
                }
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação de inserção. Messagem: " + e.getMessage());
            }
        }
    }

    public void atualizar(Cliente c) {
        try {
            this.sessao = HibernateUtil.getSessionFactory().getCurrentSession();
            this.transacao = this.sessao.beginTransaction();
            this.sessao.update(c);
            this.transacao.commit();
        } catch (HibernateException e) {
            System.out.println("Nao foi possível alterar o Cliente. Erro: " + e.getMessage());
        } finally {
            try {
                if (this.sessao.isOpen()) {
                    this.sessao.close();
                }
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação de altualização. Messagem: " + e.getMessage());
            }
        }
    }

    public void excluir(Cliente c) {
        try {
            this.sessao = HibernateUtil.getSessionFactory().getCurrentSession();
            this.transacao = this.sessao.beginTransaction();
            this.sessao.delete(c);
            this.transacao.commit();
        } catch (HibernateException e) {
            System.out.println("Nao foi possível excluir o Cliente. Erro: " + e.getMessage());
        } finally {
            try {
                if (this.sessao.isOpen()) {
                    this.sessao.close();
                }
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação de exclusão. Messagem: " + e.getMessage());
            }
        }
    }

    public void excluirById(long id) {
        Cliente c = null;
        try {
            this.sessao = HibernateUtil.getSessionFactory().getCurrentSession();
            this.transacao = this.sessao.beginTransaction();
            c = (Cliente) this.sessao.get(Cliente.class, id);
            this.sessao.delete(c);
            this.transacao.commit();
        } catch (HibernateException e) {
            System.out.println("Nao foi possível deletar o ID do Cliente. Erro: " + e.getMessage());
        } finally {
            try {
                if (this.sessao.isOpen()) {
                    this.sessao.close();
                }
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação de exclusão. Messagem: " + e.getMessage());
            }
        }
    }

    public Cliente buscaCliente(long id) {
        Cliente c = null;
        try {
            this.sessao = HibernateUtil.getSessionFactory().getCurrentSession();
            this.transacao = this.sessao.beginTransaction();
            Criteria filtro = this.sessao.createCriteria(Cliente.class);
            filtro.add(Restrictions.eq("Cliente", id));
            c = (Cliente) filtro.uniqueResult();
            this.transacao.commit();
        } catch (HibernateException e) {
            if(this.transacao.isActive()){
                this.transacao.rollback();
            }
        } finally{
           try {
                if (this.sessao.isOpen()) {
                    this.sessao.close();
                }
            } catch (HibernateException e) {
                System.out.println("Erro ao fechar operação de busca. Messagem: " + e.getMessage());
            }
        }
        return c;
    }

    public List<Cliente> listar() {
        List<Cliente> clientes = null;
        try {
            this.sessao = HibernateUtil.getSessionFactory().getCurrentSession();
            this.transacao = this.sessao.beginTransaction();
            Criteria filtro = this.sessao.createCriteria(Cliente.class);
            clientes = filtro.list();
            this.transacao.commit();
        } catch (HibernateException e) {
            if(this.transacao.isActive()){
                this.transacao.rollback();
            }
        } finally{
           try {
                if (this.sessao.isOpen()) {
                    this.sessao.close();
                }
            } catch (HibernateException e) {
                System.out.println("Erro ao fechar operação listagem. Messagem: "+e.getMessage());
            }
        }
        return clientes;
    }
}

Apl.java (classe de execução)

public class Apl {

    public static void main(String[] args) {
        HibernateUtil.getSessionFactory().openSession();

        Apl apl = new Apl();
        apl.cadastraCategorias();
        apl.cadastraFilmes();
        apl.cadastraMidias();

        Endereco endereco = new Endereco();
        Cliente cliente = new Cliente();
        ClienteDAO cliDAO = new ClienteDAO();
        EnderecoDAO endDAO = new EnderecoDAO();

        cliente.setNome("Lucas");
        cliente.setTelefone("99999999");
        cliente.setEmail("Lucas@@@@");
        endereco.setBairro("Passo D'areia");
        endereco.setRua("Assis");
        endereco.setNumero("666");
        endDAO.salvar(endereco);
        cliente.setEndereco(endereco);
        cliDAO.salvar(cliente);

        LocacaoDAO locaDAO = new LocacaoDAO();
        Locacao locacao = new Locacao();
        locacao.setDataEmprestimo(new Date(System.currentTimeMillis()));
        locacao.setHoraEmprestimo(new Time(System.currentTimeMillis()));
        locacao.setDataDevolucao(new Date(System.currentTimeMillis()));
        locacao.setCliente(cliente);

        MidiaDAO midiaDAO = new MidiaDAO();
        Midia midia = (Midia) midiaDAO.buscaMidia(new Integer(1));
        locacao.setMidia(midia);
        locaDAO.salvar(locacao);
        System.out.println("Tudo Cadastrado.");
    }

    private void cadastraCategorias() {
        String[] categorias = {"Acao", "Aventura", "Drama"};
        Categoria categoria = null;
        CategoriaDAO catDAO = new CategoriaDAO();
        for (int i = 0; i < 3; i++) {
            categoria = new Categoria();
            categoria.setCategoria(categorias[i]);
            catDAO.salvar(categoria);
        }
    }

    private void cadastraFilmes() {
        Categoria categoria = null;
        CategoriaDAO catDAO = new CategoriaDAO();
        String[] filmes = {"Sr. dos Aneis", "Matrix", "Sin City"};
        String[] descricoes = {"filme de magia", "filme de outras realidades", "filme de HQ"};
        Date[] filmesAno = {new Date(2001 - 1900), new Date(2014 - 1900), new Date(2010 - 1900)};
        FilmeDAO filDAO = new FilmeDAO();
        Filme filme = null;
        List<Categoria> resultado = catDAO.listar();
        for (int i = 0; i < 3; i++) {
            filme = new Filme();
            filme.setNome(filmes[i]);
            filme.setDescricao(descricoes[i]);
            categoria = (Categoria) resultado.get(i);
            filme.setCategoria(categoria);
            filDAO.salvar(filme);
        }
    }

    private void cadastraMidias() {
        Midia midia = null;
        Filme filme = null;
        MidiaDAO midDAO = new MidiaDAO();
        FilmeDAO filDAO = new FilmeDAO();
        List<Filme> resultado = filDAO.listar();
        for (int i = 0; i < 3; i++) {
            midia = new Midia();
            midia.setTipo("DVD");
            filme = (Filme) resultado.get(i);
            midia.setFilme(filme);
            midDAO.salvar(midia);
        }
    }
}

Erro que aparece(Sei que meu cliente vai ter Id=10, pois foi criado 9 Objs. antes dele)

Set 02, 2014 1:32:17 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 0, SQLState: 23503
Set 02, 2014 1:32:17 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: ERRO: inserção ou atualização em tabela "locacao" viola restrição de chave estrangeira "fk_5bxhc1eqwketox2wvpd1atry5"
  Detalhe: Chave (id_cliente)=(10) não está presente na tabela "cliente".
Nao foi possível inserir a Locacao. Erro: could not execute statement
Tudo Cadastrado.
Set 02, 2014 1:32:17 PM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release
INFO: HHH000010: On release of batch it still contained JDBC statements
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags hibernate sql ou faça a sua própria pergunta.