Estou com problema para cadastrar uma chave estrangeira no Hibernate

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.

[code]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);
    }[/code]

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)

mostre o mapeamento do seus pojos.

a Classe Recebimento

[code]@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 + "]";
}

}

[/code]

Classe Agenda

[code]@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 + "]";
}

}

[/code]### classe AgendaPK

[code]@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 + "]";
}

}[/code]

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

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

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!

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

[code]# String sql = "SELECT a FROM Agenda a ";

Query q = s.createQuery(sql);

result = q.list(); [/code]

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!! :confused:

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

[quote=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.

[code]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);
    }[/code]

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)[/quote]