[RESOLVIDO] java.sql.BatchUpdateException

5 respostas
A

Alguém me ajuda com um erro de persistência???
Tenho um objeto e que salva-lo no banco e em uma tabela separa guardando a referencia de produto e estoque sendo

Produto N
Estoque 1

Tenho o seguinte código.

Caused by: java.sql.BatchUpdateException: Cannot add or update a child row: a foreign key constraint fails (`waveerp`.`tbl_erp_entrada_estoque_produto`, CONSTRAINT `FK_ERP_ENTRADA_ESTOQUE_PRODUTO` FOREIGN KEY (`ID_PRODUTO`) REFERENCES `tbl_produto` (`CODIGO`) ON DELETE NO ACTION ON UPDATE NO ACTION)

EntradaEstoque.java

@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.REMOVE, mappedBy="entradaEstoque")
	@Fetch(org.hibernate.annotations.FetchMode.SELECT)
	private Collection<EntradaEstoqueProduto> produto = new ArrayList<EntradaEstoqueProduto>();

EntradaEstoqueProduto.java

public static EntradaEstoqueProduto newInstance(EntradaEstoque entradaEstoque, Produto produto, BigDecimal quantidade, BigDecimal valorUnitario, BigDecimal valorTotal, String identificacao){
		EntradaEstoqueProduto entradaEstoqueProduto = new EntradaEstoqueProduto();
		entradaEstoqueProduto.setId(new PK(entradaEstoque.getId(), produto.getCodigo()));
		entradaEstoqueProduto.setEntradaEstoque(entradaEstoque);
		entradaEstoqueProduto.setProduto(produto);
		entradaEstoqueProduto.setQuantidade(quantidade);
		entradaEstoqueProduto.setValorUnitario(valorUnitario);
		entradaEstoqueProduto.setValorTotal(valorTotal);
		entradaEstoqueProduto.setIdentificacao(identificacao);
		return entradaEstoqueProduto;
	}
	
	@Embeddable
	public static class PK implements Serializable{
		@Column(name="id_entrada_estoque", nullable=false, updatable=false)
		private Long entradaEstoqueId;
		@Column(name="id_produto", nullable=false, updatable=false)
		private Long produtoId;
		public PK(){}
		public PK(Long entradaEstoqueId, Long produtoId){
			this.entradaEstoqueId = entradaEstoqueId;
			this.produtoId = produtoId;
		}
		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result
					+ ((entradaEstoqueId == null) ? 0 : entradaEstoqueId.hashCode());
			result = prime * result
					+ ((produtoId == null) ? 0 : produtoId.hashCode());
			return result;
		}
		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			PK other = (PK) obj;
			if (entradaEstoqueId == null) {
				if (other.entradaEstoqueId != null)
					return false;
			} else if (!entradaEstoqueId.equals(other.entradaEstoqueId))
				return false;
			if (produtoId == null) {
				if (other.produtoId != null)
					return false;
			} else if (!produtoId.equals(other.produtoId))
				return false;
			return true;
		}
	}
	
	@EmbeddedId
	private PK id;
	
	@ManyToOne
	@JoinColumn(name="ID_ENTRADA_ESTOQUE", insertable=false, updatable=false, nullable=false)
	private EntradaEstoque entradaEstoque;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@Fetch(FetchMode.SELECT)
	@JoinColumn(name="ID_PRODUTO", insertable=false, updatable=false, nullable=false)
	private Produto produto;

abraços.

5 Respostas

R

Alberto Cerqueira:
Alguém me ajuda com um erro de persistência???
Tenho um objeto e que salva-lo no banco e em uma tabela separa guardando a referencia de produto e estoque sendo

Produto N
Estoque 1

Tenho o seguinte código.

Caused by: java.sql.BatchUpdateException: Cannot add or update a child row: a foreign key constraint fails (`waveerp`.`tbl_erp_entrada_estoque_produto`, CONSTRAINT `FK_ERP_ENTRADA_ESTOQUE_PRODUTO` FOREIGN KEY (`ID_PRODUTO`) REFERENCES `tbl_produto` (`CODIGO`) ON DELETE NO ACTION ON UPDATE NO ACTION)

EntradaEstoque.java

@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.REMOVE, mappedBy="entradaEstoque")
	@Fetch(org.hibernate.annotations.FetchMode.SELECT)
	private Collection<EntradaEstoqueProduto> produto = new ArrayList<EntradaEstoqueProduto>();

EntradaEstoqueProduto.java

public static EntradaEstoqueProduto newInstance(EntradaEstoque entradaEstoque, Produto produto, BigDecimal quantidade, BigDecimal valorUnitario, BigDecimal valorTotal, String identificacao){
		EntradaEstoqueProduto entradaEstoqueProduto = new EntradaEstoqueProduto();
		entradaEstoqueProduto.setId(new PK(entradaEstoque.getId(), produto.getCodigo()));
		entradaEstoqueProduto.setEntradaEstoque(entradaEstoque);
		entradaEstoqueProduto.setProduto(produto);
		entradaEstoqueProduto.setQuantidade(quantidade);
		entradaEstoqueProduto.setValorUnitario(valorUnitario);
		entradaEstoqueProduto.setValorTotal(valorTotal);
		entradaEstoqueProduto.setIdentificacao(identificacao);
		return entradaEstoqueProduto;
	}
	
	@Embeddable
	public static class PK implements Serializable{
		@Column(name="id_entrada_estoque", nullable=false, updatable=false)
		private Long entradaEstoqueId;
		@Column(name="id_produto", nullable=false, updatable=false)
		private Long produtoId;
		public PK(){}
		public PK(Long entradaEstoqueId, Long produtoId){
			this.entradaEstoqueId = entradaEstoqueId;
			this.produtoId = produtoId;
		}
		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result
					+ ((entradaEstoqueId == null) ? 0 : entradaEstoqueId.hashCode());
			result = prime * result
					+ ((produtoId == null) ? 0 : produtoId.hashCode());
			return result;
		}
		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			PK other = (PK) obj;
			if (entradaEstoqueId == null) {
				if (other.entradaEstoqueId != null)
					return false;
			} else if (!entradaEstoqueId.equals(other.entradaEstoqueId))
				return false;
			if (produtoId == null) {
				if (other.produtoId != null)
					return false;
			} else if (!produtoId.equals(other.produtoId))
				return false;
			return true;
		}
	}
	
	@EmbeddedId
	private PK id;
	
	@ManyToOne
	@JoinColumn(name="ID_ENTRADA_ESTOQUE", insertable=false, updatable=false, nullable=false)
	private EntradaEstoque entradaEstoque;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@Fetch(FetchMode.SELECT)
	@JoinColumn(name="ID_PRODUTO", insertable=false, updatable=false, nullable=false)
	private Produto produto;

abraços.

Você está tentando dar um cascade para salvar?.. se estiver tentando, troque cascade=CascadeType.REMOVE por cascade=CascadeType.ALL

R

O seu relacionamento parece estar certo… mas vc está tentando salvar um objeto referenciando uma chave que não existe no banco… no mínimo vc tem que ter essa chave lá para funcionar

A

Oi ralphsilver blz??

intão mano to usando o

cascade=CascadeType.REMOVE

Pra dropa tudo do banco quando remover. tanto do estoque, quanto da referencia para produto X estoque.

Abaixo tem minha tabela no banco (MySQL).

CREATE  TABLE IF NOT EXISTS `TBL_ERP_ENTRADA_ESTOQUE_PRODUTO` (
  `ID_ENTRADA_ESTOQUE` BIGINT NOT NULL ,
  `ID_PRODUTO` BIGINT NOT NULL ,
  `QUANTIDADE` DECIMAL(10,2)  NOT NULL,
  `VALOR_UNITARIO` DECIMAL(10,2)  NOT NULL,
  `VALOR_TOTAL` DECIMAL(10,2)  NOT NULL,
  `IDENTIFICACAO` VARCHAR(100) NOT NULL,
  `UUID` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`ID_ENTRADA_ESTOQUE`, `ID_PRODUTO`) ,
  INDEX `FK_ERP_ENTRADA_ESTOQUE_PRODUTO` (`ID_PRODUTO` ASC) ,
  INDEX `FK_ERP_ENTRADA_ESTOQUE` (`ID_ENTRADA_ESTOQUE` ASC) ,  
  CONSTRAINT `FK_ERP_ENTRADA_ESTOQUE_PRODUTO`
    FOREIGN KEY (`ID_PRODUTO`)
    REFERENCES `TBL_PRODUTO` (`CODIGO`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `FK_ERP_ENTRADA_ESTOQUE`
    FOREIGN KEY (`ID_ENTRADA_ESTOQUE`)
    REFERENCES `TBL_ERP_ENTRADA_ESTOQUE` (`ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

abraços cara.

R

Alberto Cerqueira:
Oi ralphsilver blz??

intão mano to usando o

cascade=CascadeType.REMOVE

Pra dropa tudo do banco quando remover. tanto do estoque, quanto da referencia para produto X estoque.

Abaixo tem minha tabela no banco (MySQL).

CREATE  TABLE IF NOT EXISTS `TBL_ERP_ENTRADA_ESTOQUE_PRODUTO` (
  `ID_ENTRADA_ESTOQUE` BIGINT NOT NULL ,
  `ID_PRODUTO` BIGINT NOT NULL ,
  `QUANTIDADE` DECIMAL(10,2)  NOT NULL,
  `VALOR_UNITARIO` DECIMAL(10,2)  NOT NULL,
  `VALOR_TOTAL` DECIMAL(10,2)  NOT NULL,
  `IDENTIFICACAO` VARCHAR(100) NOT NULL,
  `UUID` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`ID_ENTRADA_ESTOQUE`, `ID_PRODUTO`) ,
  INDEX `FK_ERP_ENTRADA_ESTOQUE_PRODUTO` (`ID_PRODUTO` ASC) ,
  INDEX `FK_ERP_ENTRADA_ESTOQUE` (`ID_ENTRADA_ESTOQUE` ASC) ,  
  CONSTRAINT `FK_ERP_ENTRADA_ESTOQUE_PRODUTO`
    FOREIGN KEY (`ID_PRODUTO`)
    REFERENCES `TBL_PRODUTO` (`CODIGO`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `FK_ERP_ENTRADA_ESTOQUE`
    FOREIGN KEY (`ID_ENTRADA_ESTOQUE`)
    REFERENCES `TBL_ERP_ENTRADA_ESTOQUE` (`ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

abraços cara.

Essa tabela tbl_produto está mapeada nas entidades?

A

Sim,

Alias, consegui aqui, o problema era:

Eu tava usando:

REFERENCES `TBL_PRODUTO` (`CODIGO`)

Quando a tabela certa era:

REFERENCES `TBL_STC_PRODUTO` (`CODIGO`)

ambas existem no banco, mas com funções diferentes.

Abraços cara obg pela atenção ^^

Criado 10 de setembro de 2012
Ultima resposta 10 de set. de 2012
Respostas 5
Participantes 2