Problema ao persistir classe OneToMay

Olá,

estou tendo problemas para persistir uma clase aqui, por favor olhem, e me digam o que há de errado.

O erro que esta dando é:

[TopLink Warning]: 2009.06.27 07:42:48.478--UnitOfWork(1814208212)--Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Cannot insert the value NULL into column 'codVenda', table 'TrabalhoJava.dbo.ItemVenda'; column does not allow nulls. INSERT fails.
Error Code: 515
Call: INSERT INTO ITEMVENDA (valTotal, qtdItemVenda, codVenda, codProd) VALUES (?, ?, ?, ?)
        bind => [30.0, 2, null, 1]
Query: InsertObjectQuery(br.com.trabalho.model.ItemVenda[codItemVenda=null])
Exception in thread "AWT-EventQueue-0" javax.persistence.RollbackException: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Cannot insert the value NULL into column 'codVenda', table 'TrabalhoJava.dbo.ItemVenda'; column does not allow nulls. INSERT fails.
Error Code: 515
Call: INSERT INTO ITEMVENDA (valTotal, qtdItemVenda, codVenda, codProd) VALUES (?, ?, ?, ?)
        bind => [30.0, 2, null, 1]
Query: InsertObjectQuery(br.com.trabalho.model.ItemVenda[codItemVenda=null])
        at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.commit(EntityTransactionImpl.java:120)
        at oracle.toplink.essentials.internal.ejb.cmp3.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:60)
        at br.com.trabalho.dao.TrabalhoJavaDAO.gravaVenda(TrabalhoJavaDAO.java:73)
        at br.com.trabalho.ctrl.VendaCTR.gravaVenda(VendaCTR.java:100)
        at br.com.trabalho.ctrl.VendaCTR.update(VendaCTR.java:120)
        at java.util.Observable.notifyObservers(Observable.java:142)
        at java.util.Observable.notifyObservers(Observable.java:98)
        at br.com.trabalho.model.Principal.setComando(Principal.java:22)
        at br.com.trabalho.view.VendasVIEW.jbtSalvarActionPerformed(VendasVIEW.java:434)
        at br.com.trabalho.view.VendasVIEW.access$1000(VendasVIEW.java:12)
        at br.com.trabalho.view.VendasVIEW$12.actionPerformed(VendasVIEW.java:273)
        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:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2475)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        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)
Caused by: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Cannot insert the value NULL into column 'codVenda', table 'TrabalhoJava.dbo.ItemVenda'; column does not allow nulls. INSERT fails.
Error Code: 515
Call: INSERT INTO ITEMVENDA (valTotal, qtdItemVenda, codVenda, codProd) VALUES (?, ?, ?, ?)
        bind => [30.0, 2, null, 1]
Query: InsertObjectQuery(br.com.trabalho.model.ItemVenda[codItemVenda=null])
        at oracle.toplink.essentials.exceptions.DatabaseException.sqlException(DatabaseException.java:311)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:654)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:703)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:492)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:452)
        at oracle.toplink.essentials.internal.sessions.AbstractSession.executeCall(AbstractSession.java:690)
        at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228)
        at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:214)
        at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:346)
        at oracle.toplink.essentials.internal.queryframework.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:191)
        at oracle.toplink.essentials.internal.queryframework.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:205)
        at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:564)
        at oracle.toplink.essentials.queryframework.InsertObjectQuery.executeCommit(InsertObjectQuery.java:89)
        at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.performUserDefinedWrite(DatabaseQueryMechanism.java:750)
        at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.performUserDefinedInsert(DatabaseQueryMechanism.java:714)
        at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.insertObjectForWriteWithChangeSet(DatabaseQueryMechanism.java:602)
        at oracle.toplink.essentials.queryframework.WriteObjectQuery.executeCommitWithChangeSet(WriteObjectQuery.java:162)
        at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:390)
        at oracle.toplink.essentials.queryframework.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:109)
        at oracle.toplink.essentials.queryframework.DatabaseQuery.execute(DatabaseQuery.java:628)
        at oracle.toplink.essentials.queryframework.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:555)
        at oracle.toplink.essentials.queryframework.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:138)
        at oracle.toplink.essentials.queryframework.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:110)
        at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2233)
        at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:952)
        at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:909)
        at oracle.toplink.essentials.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:269)
        at oracle.toplink.essentials.internal.sessions.CommitManager.commitAllObjectsForClassWithChangeSet(CommitManager.java:246)
        at oracle.toplink.essentials.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:202)
        at oracle.toplink.essentials.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:2657)
        at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1044)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:403)
        at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1126)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:107)
        at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:856)
        at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.commit(EntityTransactionImpl.java:102)
        ... 35 more
Caused by: java.sql.SQLException: Cannot insert the value NULL into column 'codVenda', table 'TrabalhoJava.dbo.ItemVenda'; column does not allow nulls. INSERT fails.
        at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)
        at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2816)
        at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2254)
        at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:631)
        at net.sourceforge.jtds.jdbc.JtdsStatement.processResults(JtdsStatement.java:584)
        at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQL(JtdsStatement.java:546)
        at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeUpdate(JtdsPreparedStatement.java:505)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:647)
        ... 69 more

As minha clases Venda e Itemvenda:

[code]package br.com.trabalho.model;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name=“ItemVenda”)
public class ItemVenda implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "codItemVenda",nullable=false,length=4)
private Integer codItemVenda;

@Column(name = "qtdItemVenda",nullable=false)
private int qtdItemVenda;

@Column(name = "valTotal",nullable=false)
private Double valTotal;

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "codProd", referencedColumnName = "codProd")
private Produto produto;

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "codVenda", referencedColumnName = "codVenda")
private Venda codVenda;

public ItemVenda() {
}

public ItemVenda(Integer codItemVenda) {
    this.codItemVenda = codItemVenda;
}


public ItemVenda(Produto produto, Integer qtd) {
        this.produto = produto;
        this.qtdItemVenda = qtd;
        this.valTotal = this.qtdItemVenda*produto.getPrecoProd();
}

public Integer getCodItemVenda() {
    return codItemVenda;
}

public void setCodItemVenda(Integer codItemVenda) {
    this.codItemVenda = codItemVenda;
}

public int getQtdItemVenda() {
    return qtdItemVenda;
}

public void setQtdItemVenda(int qtdItemVenda) {
    this.qtdItemVenda = qtdItemVenda;
}

public Double getValTotal() {
    return valTotal;
}

public void setValTotal(Double valTotal) {
    this.valTotal = valTotal;
}


public Venda getCodVenda() {
    return codVenda;
}

public void setCodVenda(Venda codVenda) {
    this.codVenda = codVenda;
}

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

@Override
public String toString() {
    return "br.com.trabalho.model.ItemVenda[codItemVenda=" + codItemVenda + "]";
}

public Produto getProduto() {
    return produto;
}

public void setProduto(Produto produto) {
    this.produto = produto;
}

}[/code]

[code]import java.io.Serializable;
import java.util.;
import javax.persistence.
;

@Entity
@Table(name=“Venda”)
public class Venda implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "codVenda",nullable=false)
private Integer codVenda;

@Column(name = "datVenda",nullable=false)
@Temporal(TemporalType.TIMESTAMP)
private Date datVenda = new Date();

@Column(name = "totalVenda",nullable=false)
private Double totalVenda;

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "codCli", referencedColumnName = "codCli")
private Cliente cliente;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "codVenda")
private List<ItemVenda> itensVenda;

public Venda() {
}


public Integer getCodVenda() {
    return codVenda;
}

public void setCodVenda(Integer codVenda) {
    this.codVenda = codVenda;
}

public Date getDatVenda() {
    return datVenda;
}

public void setDatVenda(Date datVenda) {
    this.datVenda = datVenda;
}

public Double getTotalVenda() {
    return totalVenda;
}

public void setTotalVenda(Double totalVenda) {
    this.totalVenda = totalVenda;
}





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

@Override
public String toString() {
    return "br.com.trabalho.model.Venda[codVenda=" + codVenda + "]";
}

/**
 * @return the itensVenda
 */
public List<ItemVenda> getItensVenda() {
    return itensVenda;
}

/**
 * @param itensVenda the itensVenda to set
 */
public void setItensVenda(List<ItemVenda> itensVenda) {
    this.itensVenda = itensVenda;
}

/**
 * @return the cliente
 */
public Cliente getCliente() {
    return cliente;
}

/**
 * @param cliente the cliente to set
 */
public void setCliente(Cliente cliente) {
    this.cliente = cliente;
}

}[/code]

Qual a duvida? A mensagem de erro é clara. Voce esta tentando gravar nulo na coluna codVenda. Verifique porque. Em algum momento voce esta setando a venda no item?

eu seto os item venda numa numa list de itemvenda e dpois eu seto essa list na venda, e mando persistir a venda.

q eu saiba essa eh o procedimento correto.

não está faltando dar new na lista itens pois faço o seguinte qdo crio


 @OneToMany(cascade = CascadeType.ALL, mappedBy = "codVenda")  
     private List&lt;ItemVenda&gt; itensVenda = new ArrayList&lt;ItemVenda&gt;();


    public void addItensVenda(ItemVenda itens) {

        itensVenda.add(itens);
   }

Tenta salvar o objeto sem ter a lista preenchida e depois que ele for salvo, adiciona a lista ao objeto que foi salvo e dá um update no objeto…

Porque esse erro esta me parecendo que é por causa da chave estrangeira na tabela da lista que esta nula quando vc tenta salvar no banco.

E fazendo aquilo eu disse eu acredito que quando vc salvar o objeto primeiro ele vai preencher o codvenda e quando vc salvar na tabela ItemVenda ele já vai ter o campo para fazer o relacionamento.

Vê se dá certo ae… deve ter uma forma mais “bonita” de fazer isso… mas tenta ae

Abraços e espero ter ajudado.

[quote=paribe]não está faltando dar new na lista itens pois faço o seguinte qdo crio

[code]

@OneToMany(cascade = CascadeType.ALL, mappedBy = “codVenda”)
private List<ItemVenda> itensVenda = new ArrayList<ItemVenda>();

public void addItensVenda(ItemVenda itens) {

    itensVenda.add(itens);

}

[/code][/quote]

Ae paribe, td bem?
Entaum kra, tem esse detalhe que eu esqueci, mas acabei de fazer aqui e nao deu certo.
Mas eu acho que é desnecessario inicializar ela pois aki, eu ja estava passando uma list para esse objeto. mas foi bom vc me lembra disso. eu assim eu ja posso colocar um metodo que adicona direto na lista, assim com vc mostrou. Mas infelizmente nao funcionou.

[quote=guilhermezerbinatti]Tenta salvar o objeto sem ter a lista preenchida e depois que ele for salvo, adiciona a lista ao objeto que foi salvo e dá um update no objeto…

Porque esse erro esta me parecendo que é por causa da chave estrangeira na tabela da lista que esta nula quando vc tenta salvar no banco.

E fazendo aquilo eu disse eu acredito que quando vc salvar o objeto primeiro ele vai preencher o codvenda e quando vc salvar na tabela ItemVenda ele já vai ter o campo para fazer o relacionamento.

Vê se dá certo ae… deve ter uma forma mais “bonita” de fazer isso… mas tenta ae

Abraços e espero ter ajudado.[/quote]

Kra, tentei e não deu certo, deu o mesmo erro.

Eu fiz o seguinte teste:

private void teste() { venda.setCliente((Cliente) genericDAO.obtemPorCodigo(10,cliente)); venda.setDatVenda(new Date()); venda.setTotalVenda(10.11); venda = (Venda) genericDAO.grava(venda); System.out.println(venda.getCodVenda()); produto = (Produto) genericDAO.obtemPorCodigo(1,produto); ivenda = new ItemVenda(produto,2); venda.addItensVenda(ivenda); produto = (Produto) genericDAO.obtemPorCodigo(3,produto); ivenda = new ItemVenda(produto,2); venda.addItensVenda(ivenda); genericDAO.grava(venda); }

Vc pode ver que eu gravo a venda sem nenhum ItemVenda, gravo ela, e automaticamente o metodo de gravação ja me retorna o objeto gravado, dpois eu adiciono os itemvenda e mando gravar ae da o erro. Tambem vc pode perceber que eu coloquei um println para me mostrar o codigo da venda dpois de gravado, e me mostra normalmente. Eu to gravando usando o comando metodo merge do EntityManager.

Eu acabei de motar uma classe de teste na qual eu monto uma venda sem nenhum itemvenda e dpois monto um itemvenda e adiciono a venda nessa itemvenda e gravo e funciona.

Cara, tô passando por um problema parecido:

Tenho uma classe Pessoa e nela tenho uma lista de telefones. O problema acontece quando crio um objeto “Pessoa”(OneToMany), crio objetos do tipo “Fone”(ManyToOne), seguindo os seguintes passos:

1- Crio objeto Pessoa;
2- Crio objetos Fone;
3- Atribuo o objeto Pessoa do passo 1 aos objetos Fone ( fone1.setPessoa(pessoa) )
4- Crio um HashSet (fones) com os objetos Fone do passo 2
5- Atribuo o HashSet de fones ao objeto Pessoa do passo 1 ( pessoa.setFones( fones ) )
6- Mando salvar o objeto pessoa no banco ( session.save(pessoa) )

O erro acontece na hora do commit:

Hibernate: insert into pessoa (nome) values (?)
Hibernate: update fone set number=?, id_pessoa=? where id=?
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
	at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61)
	at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
	at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
	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)
.
.
.

alguem pode me dar uma ajuda? já procurei esaustivamente no google…

Pelo sequencia de execução do hibernate percebo que acontece o seguinte:
ele insere o objeto pessoa e depois tenta dar um update nos objetos fones, e é aí que ocorre o erro, como ele pode dar um update num objeto que não existe no banco???

só p/ completar, aí estão os fontes das entidades:

Pessoa:

import java.util.ArrayList;
import java.util.Collection;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;


@Entity
@Table(name="pessoa")
public class Pessoa {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name="id")
	private Integer id;

	@Column(name="nome")
	private String nome;
	
	@OneToMany(mappedBy="pessoa", fetch = FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private Collection&lt;Fone&gt; fones;
	
// Getters and Setters

Fone:

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name="fone")
public class Fone implements Serializable {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name="id")
	private Integer id;

	@Column(name="number")
	private String number;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name="id_pessoa", insertable=true, updatable=true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	private Pessoa pessoa;
	
// Getters and Setters

obs: o banco de dados é MySql 5.1 e estou utilizando o MySqlConnector 5.1.7

qualquer ajuda é bem vinda

lá vai o exemplo que uso se ajudar pois esse exemplo gera fk com valor …

mas uma duvida vc está referência o item para venda conforme abaixo

	NotaFiscalItem item1 = new NotaFiscalItem();
		item1.setQtdeItem(69);
		item1.setSeqItem(01);
		item1.setId(n.getId());
		item1.setValor(909.99);
        // referencia nota fiscal
		item1.setNotafiscal(n);
		n.adicionaNotaFiscalItem(item1);

abs


package br.com.exemplojpa.modelo;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;



@Entity
@Table(name="Nota_Fiscal")
public class NotaFiscal {
	
	@Id
	@GeneratedValue
	@Column(name="ID_NOTA")
	private int id;
	@Column(name="descricao")
	private String descricao;
	@OneToMany(mappedBy= "notafiscal",cascade =javax.persistence.CascadeType.ALL)
	private List&lt;NotaFiscalItem&gt; itenss = new ArrayList&lt;NotaFiscalItem&gt;();

	@OneToOne(cascade =javax.persistence.CascadeType.ALL)
	@JoinColumn(name = "id_cliente")

	private Cliente cliente;
	public NotaFiscal(){
		
	}
	public int getId() {
		return id;
	}

	public void adicionaNotaFiscalItem(NotaFiscalItem item) {
		itenss.add(item);
	}
	public void setId(int id) {
		this.id = id;
	}


	
	
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public Cliente getCliente() {
		return cliente;
	}
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	public List&lt;NotaFiscalItem&gt; getItenss() {
		return itenss;
	}
	public void setItenss(List&lt;NotaFiscalItem&gt; itenss) {
		this.itenss = itenss;
	}
	
	
}

----
package br.com.exemplojpa.modelo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table( name="Nota_Fiscal_Item")
public class NotaFiscalItem {
	
	
	@Id
	@GeneratedValue
	@Column(name="id_item")
    private int id;
	
	@Column
	private int seqItem;
	
	@Column
	private int qtdeItem;

    private double valor;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn (name = "fk_id_nota")	
	private NotaFiscal notafiscal;

	public NotaFiscalItem(int xqtde){
		this.qtdeItem= xqtde;
	}
	
    public NotaFiscalItem( String nome){
		
	}
    
    public NotaFiscalItem(){
	
	}
	public int getId() {
		return id;
	}


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


	public int getSeqItem() {
		return seqItem;
	}


	public void setSeqItem(int seqItem) {
		this.seqItem = seqItem;
	}


	public int getQtdeItem() {
		return qtdeItem;
	}


	public void setQtdeItem(int qtdeItem) {
		this.qtdeItem = qtdeItem;
	}


	public NotaFiscal getNotafiscal() {
		return notafiscal;
	}


	public void setNotafiscal(NotaFiscal notafiscal) {
		this.notafiscal = notafiscal;
	}

	public double getValor() {
		return valor;
	}

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


----------

public class TesteNF {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//BasicConfigurator.configure();
        //Logger.getLogger("org").setLevel(Level.ERROR);
        
       // System.out.println("Inicio...");
		// TODO Auto-generated method stub
		//org.apache.log4j.BasicConfigurator.configure();
		
    	System.out.println("Inicio...");
		NFDAO nfDAO = new NFDAO();
		
		Cliente cli = new Cliente();
		cli.setEstado("RO");
		cli.setNome("Paulo Ribeiro");
		
		NotaFiscal n = new NotaFiscal();
		n.setDescricao("NOta Fiscal SP");
		n.setCliente(cli);
		
		NotaFiscalItem item1 = new NotaFiscalItem();
		item1.setQtdeItem(69);
		item1.setSeqItem(01);
		item1.setId(n.getId());
		item1.setValor(909.99);
        // referencia nota fiscal
		item1.setNotafiscal(n);
		n.adicionaNotaFiscalItem(item1);
		
		
		NotaFiscalItem item2 = new NotaFiscalItem();
		item2.setQtdeItem(1111);
		item2.setSeqItem(02);
		item2.setId(n.getId());
		item1.setValor(123.56);
		// referencia nota fiscal
		item2.setNotafiscal(n);
		n.adicionaNotaFiscalItem(item2);
		
		nfDAO.inserirNF(n);
		System.out.println("Gravação ok....Nota = "+n.getId() + " Cliente Id= "+cli.getId());
		System.out.println("---------Item ------------");
		for (NotaFiscalItem it: n.getItenss()){
			System.out.println(" Item ="+it.getId()+" Seq= "+it.getSeqItem()+" Valor = "+it.getValor());
		}
		System.out.println("---------Item ------------");
	}

}

----
package br.com.exemplojpa.modelo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="Cliente")
public class Cliente {

	@Id
	@GeneratedValue
	@Column(name="id_cliente")
	private int id;
	@Column
	private String nome;
	@Column
	private String estado;
	
	public Cliente(){
		
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEstado() {
		return estado;
	}
	public void setEstado(String estado) {
		this.estado = estado;
	}
	
}

----
public class NFDAO {
	

	private EntityManagerFactory factory = null;

	private EntityManager manager = null;

	public NFDAO() {
		
		factory = Persistence.createEntityManagerFactory("JPA9");
		
		//factory = Persistence.createEntityManagerFactory("JPA9",getConf());
		manager = factory.createEntityManager();
	}

	/**
	 * Inserindo um NF
	 * 
	 * @param universidade
	 */
	public void inserirNF(NotaFiscal nf) {

		EntityTransaction transaction = manager.getTransaction();

		try {
			  transaction.begin();
			  manager.persist(nf);
  			  transaction.commit();
			  manager.close();
              System.out.println("Inclusão OK...");
		} catch (Exception e) {
			transaction.rollback();
			System.err.println("Erro: " + e.getMessage());
		} finally {
			
		}

	}

[quote=paribe]lá vai o exemplo que uso se ajudar pois esse exemplo gera fk com valor …

mas uma duvida vc está referência o item para venda conforme abaixo

	NotaFiscalItem item1 = new NotaFiscalItem();
		item1.setQtdeItem(69);
		item1.setSeqItem(01);
		item1.setId(n.getId());
		item1.setValor(909.99);
        // referencia nota fiscal
		item1.setNotafiscal(n);
		n.adicionaNotaFiscalItem(item1);

[/quote]

Paribe, se vc não fosse homem eu te beijava … sorte que sou muito homem e gosto de mulher… :lol: :lol: :lol:

Usando seu exemplo deu certo, eu não estava setando venda na item venda…fiz isso e deu certo, as minhas classes de entidade fikaram todas do jeito que tava, nao precisei alterar nd.

Obrigadão kra, vc salvou meu semestre na matéria de Linguagem de Programação 3 na faculdade… :wink:
Abraços

Que bom que vc’s conseguiram progredir p/ resolver esse problema…

já no que eu descrevi encontrei o motivo que causou o meu problema: a chave estrangeira.

não sei pq acontece isso, mas depois que excluí a FK de “fone” para “pessoa” ficou tudo certo, exceto que fiquei sem relacionamento no BD. Vou continuar procurando uma solução melhor, se encontrar eu posto aki…

k bom que deu certo…e passa pra frente seu conhecimento que um dia vc pode fazer alguém feliz tb…

bom final de semana …

abs

Descobri a besteira que eu tinha feito, era uma FK criada de forma errada, recriei a dita cuja e tá tudo certinho agora… :lol: