Jpa remover Item com Duas FKs erro

7 respostas
G

Ola Pessoal

Tenho a Seguinte estrutura

Quando faco exclusao de um item e dou setcollection em AdmVendas é disparada uma excessao :

at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
Caused by: org.hibernate.ObjectDeletedException: deleted entity passed to persist: [sof.db.administrativo.AdmItem#<null>]
        at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:90)
        at org.hibernate.impl.SessionImpl.firePersistOnFlush(SessionImpl.java:644)
        at org.hibernate.impl.SessionImpl.persistOnFlush(SessionImpl.java:636)
        at org.hibernate.engine.CascadingAction$9.cascade(CascadingAction.java:323)
        at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
        at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
        at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
        at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
        at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
        at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
        at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
        at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
        at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:131)
        at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:122)
        at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:65)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
        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 org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
        ... 35 more
27/09/2011 11:36:45 sof.forms.Toolbar btn_SALVARActionPerformed

Imagino que seja por causa da estrutura de uma tabela filha com duas FKs mas nao achei solucao ainda

Alguem pode me ajudar ?

7 Respostas

A

coloca suas entidades ai para poder te ajudar.

t+

G

Aee vao as entidades

public class AdmVendas implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id @GeneratedValue(strategy=GenerationType.AUTO,generator="GEN_TB_ADM_VENDAS")
    @Basic(optional = false)
    @Column(name = "ID_ADM_VENDAS", nullable = false)
    private Integer idAdmVendas;
    @Column(name = "ID_PESSOA")
    private Integer idPessoa;
    @Basic(optional = false)
    @Column(name = "DTVENDA", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date dtvenda;
    @Column(name = "IDFPG")
    private Integer idfpg;
    @Column(name = "NPAR")
    private Integer npar;
    @Column(name = "VLBRUTO", precision = 13, scale = 2)
    private BigDecimal vlbruto;
    @Column(name = "PCDESC", precision = 5, scale = 2)
    private BigDecimal pcdesc;
    @Column(name = "VLDESC", precision = 13, scale = 2)
    private BigDecimal vldesc;
    @Column(name = "VLVENDA", precision = 13, scale = 2)
    private BigDecimal vlvenda;
    @Column(name = "CODOBJETO", length = 20)
    private String codobjeto;
    @Column(name = "CTMANUT")
    private Character ctmanut;
    @Column(name = "VLMANUT", precision = 13, scale = 2)
    private BigDecimal vlmanut;
    @Column(name = "ID_COMIS")
    private Integer idComis;
    @Column(name = "PCCOMIS", precision = 5, scale = 2)
    private BigDecimal pccomis;
    @Column(name = "VLCOMIS", precision = 13, scale = 2)
    private BigDecimal vlcomis;
    @Lob
    @Column(name = "OBS")
    private byte[] obs;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idAdmVendas")
    @org.hibernate.annotations.Cascade(
       value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN  )
    private Collection<AdmItem> admItemCollection;
public class AdmProduto implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id @GeneratedValue(strategy=GenerationType.AUTO,generator="GEN_TB_ADM_PRODUTO")
    @Basic(optional = false)
    @Column(name = "ID_ADM_PRODUTO", nullable = false)
    private Integer idAdmProduto;
    @Column(name = "NOME", length = 50)
    private String nome;
    @Column(name = "PRECO_VENDA", precision = 13, scale = 2)
    private BigDecimal precoVenda;
    @Column(name = "PRECO_MANUT", precision = 13, scale = 2)
    private BigDecimal precoManut;
    @Lob
    @Column(name = "DESCRICAO")
    private byte[] descricao;
    @Column(name = "TIPO")
    private Character tipo;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idAdmProduto")
   /* @org.hibernate.annotations.Cascade(
       value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN  )*/
    private Collection<AdmItem> admItemCollection;
public class AdmItem implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id @GeneratedValue(strategy=GenerationType.AUTO,generator="GEN_TB_ADM_ITEM")
    @Basic(optional = false)
    @Column(name = "ID_ADM_ITEM", nullable = false)
    private Integer idAdmItem;
    @Column(name = "QTDE")
    private Integer qtde;
    @Column(name = "VLUNIT", precision = 13, scale = 2)
    private BigDecimal vlunit;
    @Column(name = "PCDESC", precision = 5, scale = 2)
    private BigDecimal pcdesc;
    @Column(name = "VLDESC", precision = 13, scale = 2)
    private BigDecimal vldesc;
    @Column(name = "VLTOTAL", precision = 13, scale = 2)
    private BigDecimal vltotal;
    @Column(name = "VLMANUT", precision = 13, scale = 2)
    private BigDecimal vlmanut;
    @Lob
    @Column(name = "OBS")
    private byte[] obs;
    @JoinColumn(name = "ID_ADM_PRODUTO", referencedColumnName = "ID_ADM_PRODUTO", nullable = false)
    @ManyToOne(optional = false)
    private AdmProduto idAdmProduto;
    @JoinColumn(name = "ID_ADM_VENDAS", referencedColumnName = "ID_ADM_VENDAS", nullable = false)
    @ManyToOne(optional = false)
    private AdmVendas idAdmVendas;
A

cara,
da uma olhada nesse link http://www.guj.com.br/java/201169-erro-ao-deletar-registro-do-banco-de-dados

t+

G

alissonvla

jah vi esse post.

ele refere que a solucao está no Cascade mas não publicou como resolveu.

Se vc puder ajudar agradeco

A

coloque isso na sua classe AdmItem, no atributo idAdmProduto e idAdmVendas,

@JoinColumn(name = "ID_ADM_PRODUTO", referencedColumnName = "ID_ADM_PRODUTO", nullable = false)  
    @ManyToOne(optional = false, cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})

vc quer excluir AdmItem, mas não quer apagar AdmProduto e AdmVenda, correto?

t+

G

O procedimento é o seguinte :

O cliente exclui uma Linha de uma JTable

Carrego a JTable num ArraList

Dou SetAdmItemCollection na Classe AdmVendas sem uma a Linha Excluida

Ocorre o Erro pq tenho uma FK no AdmProduto.

A

cara,

fiz um teste aqui num exemplo que eu tenho e funcionou cara, vo posta-lo aqui

@Entity
@Table(name="teste2")
public class Teste2 implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer idteste2;

	private String nome;

	//bi-directional many-to-one association to Teste1
	@OneToMany(mappedBy="teste2", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	private List<Teste1> teste1s;

    public Teste2() {
    	this.teste1s = new ArrayList<Teste1>();
    }
}
@Entity
@Table(name="teste1")
public class Teste1 implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int idteste1;

	private String nome;

	//bi-directional many-to-one association to Teste2
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="teste2")
	private Teste2 teste2;

    public Teste1() {
    }
}
public class Teste {
	public static void main(String[] args) {
		EntityManager entityManager = Persistence.createEntityManagerFactory("PERSIST_UNIT").createEntityManager();
		Teste2 t2 = entityManager.find(Teste2.class, 8);
		
		t2.getTeste1s().remove(0);
		
		entityManager.getTransaction().begin();
		entityManager.merge(t2);
		entityManager.getTransaction().commit();
	}
}

espero que te ajude

t+

Criado 27 de setembro de 2011
Ultima resposta 28 de set. de 2011
Respostas 7
Participantes 2