Estou com problema para cadastrar uma chave estrangeira no Hibernate

6 respostas
A

Tenho uma uma tabela "Recebimento" e outra chamada "Agenda" quando eu adiciono o objeto Agenda no Objeto Recebimento e do o commit ele esta dando erro, fiz até um novo sql para ver se estava pegando a Agenda certa.

String sql = "SELECT a FROM Agenda a ";
        Query q = s.createQuery(sql);
        result = q.list();
        Recebimento rec = new Recebimento();
            rec.setAgenda(null);//((Agenda) line.get((Tabela.getSelectedColumn() / 2) - 1)));
            Agenda ageteste ;
            ageteste=(Agenda) result.get(0);   
            rec.setAgenda(ageteste);         <<<==========SE EU COLOCAR NULL ELE FUNCIONA NORMALMENTE
            rec.setRecValorrecebido(BigDecimal.ZERO);         
            rec.setRecVencimento(age.getAgendaPK().getAgenData());
            rec.setRecValor(BigDecimal.valueOf(age.getServico().getSerValor()));
            rec.setMatricula(null);
            rec.setCaixa(null);

            rec.setTpRecebimento(null);
            rec.setRecDtrecebimento(null);
            s.save(rec);
            t.commit();
            JOptionPane.showMessageDialog(this, "Executado com Sucesso!", "Mensagem", JOptionPane.WARNING_MESSAGE);
        } catch (HibernateException he) {
            he.printStackTrace();
            t.rollback();
            JOptionPane.showMessageDialog(this, "Erro na Execução! erro:" + he.getMessage(), "Mensagem", JOptionPane.ERROR_MESSAGE);
        }

O ERRO QUE ELE GERA É ESSE:

29/03/2011 18:15:09 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: null
29/03/2011 18:15:09 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Entrada em lote 0 insert into recebimento (agen_horario, agen_data, cli_id, cai_id, mat_id, rec_dtrecebimento, rec_valor, rec_valorrecebido, rec_vencimento, tprec_id, rec_id) values (2011-02-28 -03:00:00, 1969-12-31 08:00:00.000000 -03:00:00, 1, NULL, NULL, NULL, 155.5500030517578, 0, 2011-03-29 -03:00:00, NULL, 53) foi abortada. Chame getNextException para ver a causa.
29/03/2011 18:15:09 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: 23503
29/03/2011 18:15:09 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERROR: insert or update on table "recebimento" violates foreign key constraint "fkfa9dfb75cac68c22"
Detalhe: Key (agen_data,agen_horario,cli_id)=(1969-12-31,2011-02-28 00:00:00,1) is not present in table "agenda".
29/03/2011 18:15:09 org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SEVERE: Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at Interface.Movimentacao.Agendamento.BgerarActionPerformed(Agendamento.java:735)
at Interface.Movimentacao.Agendamento.access$1000(Agendamento.java:34)
at Interface.Movimentacao.Agendamento$11.actionPerformed(Agendamento.java:401)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6134)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5899)
at java.awt.Container.processEvent(Container.java:2023)
at java.awt.Component.dispatchEventImpl(Component.java:4501)
at java.awt.Container.dispatchEventImpl(Container.java:2081)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3965)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895)
at java.awt.Container.dispatchEventImpl(Container.java:2067)
at java.awt.Window.dispatchEventImpl(Window.java:2458)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

6 Respostas

T

mostre o mapeamento do seus pojos.

A

a Classe Recebimento

@Entity
@Table(name = "recebimento")
@NamedQueries({
    @NamedQuery(name = "Recebimento.findAll", query = "SELECT r FROM Recebimento r"),
    @NamedQuery(name = "Recebimento.findByRecId", query = "SELECT r FROM Recebimento r WHERE r.recId = :recId"),
    @NamedQuery(name = "Recebimento.findByRecValor", query = "SELECT r FROM Recebimento r WHERE r.recValor = :recValor"),
    @NamedQuery(name = "Recebimento.findByRecDtrecebimento", query = "SELECT r FROM Recebimento r WHERE r.recDtrecebimento = :recDtrecebimento"),
    @NamedQuery(name = "Recebimento.findByRecVencimento", query = "SELECT r FROM Recebimento r WHERE r.recVencimento = :recVencimento"),
    @NamedQuery(name = "Recebimento.findByRecValorrecebido", query = "SELECT r FROM Recebimento r WHERE r.recValorrecebido = :recValorrecebido")})
public class Recebimento implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @SequenceGenerator(name="SEQ", sequenceName="recebimento_rec_id_seq")
    @GeneratedValue(strategy=GenerationType.AUTO, generator="SEQ")
    @Basic(optional = false)
    @Column(name = "rec_id")
    private Integer recId;
    @Basic(optional = false)
    @Column(name = "rec_valor")
    private BigDecimal recValor;
    @Column(name = "rec_dtrecebimento")
    @Temporal(TemporalType.DATE)
    private Date recDtrecebimento;
    @Basic(optional = false)
    @Column(name = "rec_vencimento")
    @Temporal(TemporalType.DATE)
    private Date recVencimento;
    @Column(name = "rec_valorrecebido")
    private BigDecimal recValorrecebido;
    @JoinColumn(name = "tprec_id", referencedColumnName = "tprec_id")
    @ManyToOne(fetch = FetchType.EAGER)
    private TpRecebimento tpRecebimento;
    @JoinColumn(name = "mat_id", referencedColumnName = "mat_id")
    @ManyToOne(fetch = FetchType.EAGER)
    private Matricula matricula;
    @JoinColumn(name = "cai_id", referencedColumnName = "cai_id")
    @ManyToOne(fetch = FetchType.EAGER)
    private Caixa caixa;
    @JoinColumns({
        @JoinColumn(name = "agen_data", referencedColumnName = "agen_horario"),
        @JoinColumn(name = "agen_horario", referencedColumnName = "agen_data"),
        @JoinColumn(name = "cli_id", referencedColumnName = "cli_id")})
    @ManyToOne(fetch = FetchType.EAGER)
    private Agenda agenda;

    public Recebimento() {
    }

    public Recebimento(Integer recId) {
        this.recId = recId;
    }

    public Recebimento(Integer recId, BigDecimal recValor, Date recVencimento) {
        this.recId = recId;
        this.recValor = recValor;
        this.recVencimento = recVencimento;
    }

    public Integer getRecId() {
        return recId;
    }

    public void setRecId(Integer recId) {
        this.recId = recId;
    }

    public BigDecimal getRecValor() {
        return recValor;
    }

    public void setRecValor(BigDecimal recValor) {
        this.recValor = recValor;
    }

    public Date getRecDtrecebimento() {
        return recDtrecebimento;
    }

    public void setRecDtrecebimento(Date recDtrecebimento) {
        this.recDtrecebimento = recDtrecebimento;
    }

    public Date getRecVencimento() {
        return recVencimento;
    }

    public void setRecVencimento(Date recVencimento) {
        this.recVencimento = recVencimento;
    }

    public BigDecimal getRecValorrecebido() {
        return recValorrecebido;
    }

    public void setRecValorrecebido(BigDecimal recValorrecebido) {
        this.recValorrecebido = recValorrecebido;
    }

    public TpRecebimento getTpRecebimento() {
        return tpRecebimento;
    }

    public void setTpRecebimento(TpRecebimento tpRecebimento) {
        this.tpRecebimento = tpRecebimento;
    }

    public Matricula getMatricula() {
        return matricula;
    }

    public void setMatricula(Matricula matricula) {
        this.matricula = matricula;
    }

    public Caixa getCaixa() {
        return caixa;
    }

    public void setCaixa(Caixa caixa) {
        this.caixa = caixa;
    }

    public Agenda getAgenda() {
        return agenda;
    }

    public void setAgenda(Agenda agenda) {
        this.agenda = agenda;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (recId != null ? recId.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 Recebimento)) {
            return false;
        }
        Recebimento other = (Recebimento) object;
        if ((this.recId == null && other.recId != null) || (this.recId != null && !this.recId.equals(other.recId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Interface.Movimentacao.teste.Recebimento[recId=" + recId + "]";
    }

}
#### Classe Agenda
@Entity
@Table(name = "agenda")
@NamedQueries({
    @NamedQuery(name = "Agenda.findAll", query = "SELECT a FROM Agenda a"),
    @NamedQuery(name = "Agenda.findByAgenHorario", query = "SELECT a FROM Agenda a WHERE a.agendaPK.agenHorario = :agenHorario"),
    @NamedQuery(name = "Agenda.findByAgenData", query = "SELECT a FROM Agenda a WHERE a.agendaPK.agenData = :agenData"),
    @NamedQuery(name = "Agenda.findByCliId", query = "SELECT a FROM Agenda a WHERE a.agendaPK.cliId = :cliId"),
    @NamedQuery(name = "Agenda.findByAgenPresenca", query = "SELECT a FROM Agenda a WHERE a.agenPresenca = :agenPresenca")})
public class Agenda implements Serializable {
    private static final long serialVersionUID = 1L;
    @EmbeddedId
    protected AgendaPK agendaPK;
    @Column(name = "agen_presenca")
    private Boolean agenPresenca;
    @JoinColumn(name = "ser_id", referencedColumnName = "ser_id")
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    private Servico servico;
    @JoinColumn(name = "fun_id", referencedColumnName = "fun_id")
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    private Funcionario funcionario;
    @JoinColumn(name = "cli_id", referencedColumnName = "cli_id", insertable = false, updatable = false)
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    private Cliente cliente;

    public Agenda() {
    }

    public Agenda(AgendaPK agendaPK) {
        this.agendaPK = agendaPK;
    }

    public Agenda(Date agenHorario, Date agenData, int cliId) {
        this.agendaPK = new AgendaPK(agenHorario, agenData, cliId);
    }

    public AgendaPK getAgendaPK() {
        return agendaPK;
    }

    public void setAgendaPK(AgendaPK agendaPK) {
        this.agendaPK = agendaPK;
    }

    public Boolean getAgenPresenca() {
        return agenPresenca;
    }

    public void setAgenPresenca(Boolean agenPresenca) {
        this.agenPresenca = agenPresenca;
    }

    public Servico getServico() {
        return servico;
    }

    public void setServico(Servico servico) {
        this.servico = servico;
    }

    public Funcionario getFuncionario() {
        return funcionario;
    }

    public void setFuncionario(Funcionario funcionario) {
        this.funcionario = funcionario;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (agendaPK != null ? agendaPK.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 Agenda)) {
            return false;
        }
        Agenda other = (Agenda) object;
        if ((this.agendaPK == null && other.agendaPK != null) || (this.agendaPK != null && !this.agendaPK.equals(other.agendaPK))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Interface.Movimentacao.teste.Agenda[agendaPK=" + agendaPK + "]";
    }

}
### classe AgendaPK
@Embeddable
public class AgendaPK implements Serializable {
    @Basic(optional = false)
    @Column(name = "agen_horario")
    @Temporal(TemporalType.TIMESTAMP)
    private Date agenHorario;
    @Basic(optional = false)
    @Column(name = "agen_data")
    @Temporal(TemporalType.DATE)
    private Date agenData;
    @Basic(optional = false)
    @Column(name = "cli_id")
    private int cliId;

    public AgendaPK() {
    }

    public AgendaPK(Date agenHorario, Date agenData, int cliId) {
        this.agenHorario = agenHorario;
        this.agenData = agenData;
        this.cliId = cliId;
    }

    public Date getAgenHorario() {
        return agenHorario;
    }

    public void setAgenHorario(Date agenHorario) {
        this.agenHorario = agenHorario;
    }

    public Date getAgenData() {
        return agenData;
    }

    public void setAgenData(Date agenData) {
        this.agenData = agenData;
    }

    public int getCliId() {
        return cliId;
    }

    public void setCliId(int cliId) {
        this.cliId = cliId;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (agenHorario != null ? agenHorario.hashCode() : 0);
        hash += (agenData != null ? agenData.hashCode() : 0);
        hash += (int) cliId;
        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 AgendaPK)) {
            return false;
        }
        AgendaPK other = (AgendaPK) object;
        if ((this.agenHorario == null && other.agenHorario != null) || (this.agenHorario != null && !this.agenHorario.equals(other.agenHorario))) {
            return false;
        }
        if ((this.agenData == null && other.agenData != null) || (this.agenData != null && !this.agenData.equals(other.agenData))) {
            return false;
        }
        if (this.cliId != other.cliId) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Interface.Movimentacao.teste.AgendaPK[agenHorario=" + agenHorario + ", agenData=" + agenData + ", cliId=" + cliId + "]";
    }

}

Se alguem puder me ajudar ficarei agradecido!! fais algum tempo que eu estou nesse problema :/

kenneth

Putz, sera que ninguem le aquele topico do "… antes de perguntar… "?

Da uma lida aqui brow, ajuda bastante a galera a visualizar seu topico…
http://guj.com.br/java/50115-voce-e-novo-no-guj-vai-criar-um-topico-e-colar-seu-codigo-fonte-leia-aqui-antes-por-favor

Abraco

kenneth

Certo, bem melhor agora… :smiley:

O seu problema ta aqui, parceiro:

insert or update on table "recebimento" violates foreign key constraint "fkfa9dfb75cac68c22"
Detalhe: Key (agen_data,agen_horario,cli_id)=(1969-12-31,2011-02-28 00:00:00,1) is not present in table "agenda"

Ou seja, voce ta querendo gravar um recebimento, que possui uma chave estrangeira em agenda, mas o agenda ainda
nao existe no banco.

Tente salvar primeiro a(s) agenda(s), e depois o recebimento.

Abraco!

A

Olá amigo!!!
isso e justamente meu problema!! as Agenda existe!!!
tanto é q eu fiz um teste assim:

# String sql = "SELECT a FROM Agenda a ";  
#         Query q = s.createQuery(sql);  
#         result = q.list();

Estou pegando uma agenda direta do banco para fazer o teste e mesmo assim da esse erro, ja debuguei, o metodo esta pegando a agenda certinho!! :/

Ja testei varias formas mais não conssigo setar a Agenda no Recebimento!!

A
andreaoki:
Tenho uma uma tabela "Recebimento" e outra chamada "Agenda" quando eu adiciono o objeto Agenda no Objeto Recebimento e do o commit ele esta dando erro, fiz até um novo sql para ver se estava pegando a Agenda certa.
String sql = "SELECT a FROM Agenda a ";
        Query q = s.createQuery(sql);
        result = q.list();
        Recebimento rec = new Recebimento();
            rec.setAgenda(null);//((Agenda) line.get((Tabela.getSelectedColumn() / 2) - 1)));
            Agenda ageteste ;
            ageteste=(Agenda) result.get(0);   
            rec.setAgenda(ageteste);         <<<==========SE EU COLOCAR NULL ELE FUNCIONA NORMALMENTE
            rec.setRecValorrecebido(BigDecimal.ZERO);         
            rec.setRecVencimento(age.getAgendaPK().getAgenData());
            rec.setRecValor(BigDecimal.valueOf(age.getServico().getSerValor()));
            rec.setMatricula(null);
            rec.setCaixa(null);

            rec.setTpRecebimento(null);
            rec.setRecDtrecebimento(null);
            s.save(rec);
            t.commit();
            JOptionPane.showMessageDialog(this, "Executado com Sucesso!", "Mensagem", JOptionPane.WARNING_MESSAGE);
        } catch (HibernateException he) {
            he.printStackTrace();
            t.rollback();
            JOptionPane.showMessageDialog(this, "Erro na Execução! erro:" + he.getMessage(), "Mensagem", JOptionPane.ERROR_MESSAGE);
        }

O ERRO QUE ELE GERA É ESSE:

29/03/2011 18:15:09 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: null
29/03/2011 18:15:09 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Entrada em lote 0 insert into recebimento (agen_horario, agen_data, cli_id, cai_id, mat_id, rec_dtrecebimento, rec_valor, rec_valorrecebido, rec_vencimento, tprec_id, rec_id) values (2011-02-28 -03:00:00, 1969-12-31 08:00:00.000000 -03:00:00, 1, NULL, NULL, NULL, 155.5500030517578, 0, 2011-03-29 -03:00:00, NULL, 53) foi abortada. Chame getNextException para ver a causa.
29/03/2011 18:15:09 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: 23503
29/03/2011 18:15:09 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERROR: insert or update on table "recebimento" violates foreign key constraint "fkfa9dfb75cac68c22"
Detalhe: Key (agen_data,agen_horario,cli_id)=(1969-12-31,2011-02-28 00:00:00,1) is not present in table "agenda".
29/03/2011 18:15:09 org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SEVERE: Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at Interface.Movimentacao.Agendamento.BgerarActionPerformed(Agendamento.java:735)
at Interface.Movimentacao.Agendamento.access$1000(Agendamento.java:34)
at Interface.Movimentacao.Agendamento$11.actionPerformed(Agendamento.java:401)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6134)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5899)
at java.awt.Container.processEvent(Container.java:2023)
at java.awt.Component.dispatchEventImpl(Component.java:4501)
at java.awt.Container.dispatchEventImpl(Container.java:2081)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3965)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895)
at java.awt.Container.dispatchEventImpl(Container.java:2067)
at java.awt.Window.dispatchEventImpl(Window.java:2458)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Criado 29 de março de 2011
Ultima resposta 31 de mar. de 2011
Respostas 6
Participantes 3