Produtos em duplicidade

20 respostas
1

Oie estou fazendo um cadastro de produtos.
E preciso colocar um critério para o produto não ser inserido na mesma empresa novamente.
Estou tentando fazer, mas não está funcionando!

ProdutoEmpresaDAO.

//Verifica se o produto já pertence aquela empresa
		
		public boolean existeProduto(ProdutoEmpresa produtoEmpresa) {
					ProdutoEmpresa encontrado = (ProdutoEmpresa) session.createCriteria(ProdutoEmpresa.class)
					.createCriteria("produto")
					.add(Restrictions.eq("id", produtoEmpresa.getProduto().getId()))
					.uniqueResult();
								
			return encontrado != null;
		}

Meu controller

// Adicionar
	@Audit
	@Business
	@Post("/produtoEmpresa")
	public void adiciona(ProdutoEmpresa produtoEmpresa) {

		if (dao.existeProduto(produtoEmpresa)) {
			validator.add(new ValidationMessage("Produto Já existe",
					"produtoEmpresa.produto.id"));
			validator.onErrorUsePageOf(ProdutoEmpresaController.class);
			//dao.salva(produtoEmpresa);
			result.redirectTo(ProdutoEmpresaController.class).lista();
		}else{

		dao.salva(produtoEmpresa);

		// Colocando o ProdutoEmpresa na Sessão
		ProdutoEmpresaEmProgresso.setSprodutoEmpresa(produtoEmpresa);

		// Redireciona para a página de administração
		result.redirectTo(AdministracaoController.class).empresa();
		}

	}

20 Respostas

R

O critério não pode ser o Id. Se você está cadastrando um produto novo, mesmo que todos os atributos sejam iguais, o Id deles não será, você tem que usar outros atributos como parâmetro.

Não sei como está o seu cadastro, fazer por nome fica um tanto estranho, talvez por algum código, como o EAN, ou PLU.

1

Esqueci de falar.

Eu tenho um cadastro de produtos.
1 tinta
2 tijolo
3 areia

A empresa vai colocar o preço no produto.

Por exemplo.

Empresa 1

Tabela ProdutoEmpresa

1 cod produto = 1 preço 10.00 reais.

Empresa 2

Tabela ProdutoEmpresa
1 cod produto 2 preço 40.00 reais.

E assim vai.

Agora, se a empresa 1 quiser adicionar o mesmo produto, ela ta conseguindo e não pode ser.

Tipo.

2 cod produto = 1 preço 12.00 reais.

Ta vendo a duplicidade?

valeu

R

Ainda é a mesma situação, você precisa de algum parâmetro para comparar o produto. E aí verifica junto com a empresa

Se existir um registro na tabela com o campo X igual a esse e a empresa igual a essa, você não permite o insert.

C

Faz o seguinte

ProdutoEmpresa encontrado = (ProdutoEmpresa) session.createCriteria(ProdutoEmpresa.class)  
            .createAlias("produto")  
            .add(Restrictions.eq("id", produtoEmpresa.getProduto().getId()))  
            .uniqueResult();

da uma pesquisa no createAlias não me lembro exatamente dos parametros…

mas isso que voce esta fazendo deveria funcionar sim, mais uma coisa voce não deveria adicionar mais um where por id da empresa

se a empresa 1 cadastrar o preco do jeito que esta quando a validação funcionar a empresa dois não podera cadastrrar o preco pois a empresa 1 ja tem um registro na tabela em questao para aquele produto…

entendeu?

R

CristianPalmaSola10:
Faz o seguinte

ProdutoEmpresa encontrado = (ProdutoEmpresa) session.createCriteria(ProdutoEmpresa.class)  
            .createAlias("produto")  
            .add(Restrictions.eq("id", produtoEmpresa.getProduto().getId()))  
            .uniqueResult();

da uma pesquisa no createAlias não me lembro exatamente dos parametros…

mas isso que voce esta fazendo deveria funcionar sim, mais uma coisa voce não deveria adicionar mais um where por id da empresa

se a empresa 1 cadastrar o preco do jeito que esta quando a validação funcionar a empresa dois não podera cadastrrar o preco pois a empresa 1 ja tem um registro na tabela em questao para aquele produto…

entendeu?


Como vai funcionar se o produto novo não tem id?

H

Rodrigo Sasaki:
CristianPalmaSola10:
Faz o seguinte

ProdutoEmpresa encontrado = (ProdutoEmpresa) session.createCriteria(ProdutoEmpresa.class)  
            .createAlias("produto")  
            .add(Restrictions.eq("id", produtoEmpresa.getProduto().getId()))  
            .uniqueResult();

da uma pesquisa no createAlias não me lembro exatamente dos parametros…

mas isso que voce esta fazendo deveria funcionar sim, mais uma coisa voce não deveria adicionar mais um where por id da empresa

se a empresa 1 cadastrar o preco do jeito que esta quando a validação funcionar a empresa dois não podera cadastrrar o preco pois a empresa 1 ja tem um registro na tabela em questao para aquele produto…

entendeu?


Como vai funcionar se o produto novo não tem id?
Mahuahuahuahuahuhuahuahuahuahahuahuhuahuahuahuahahuahahhuaa
Cara tiver que rir dessa. Mahhuahahuahahahahuahaha


Voltando ao assunto do tópico, coloque o nome (por exemplo) do produto como único no DB. Aí se tu tentar inserir alguém repetido vai dar exception.

1

Valeu Hebert,

Vou testar aqui, e posto.

C

Na verdade pelo que entendi é isso

existe duas empresa
Empresa Urbainski
Empresa Sasaki

e o produto 1 - tijolo cadastrado no banco

na Empresa Urbainski o produto 1 custa 300 o milheiro

ai voce ira cadastrar na Empresa Sasaki o valor do produto 1 na sua empresa

voce poder reparar na restrictions que é feita a criteria na classe produtoempresa, o id do produto é usado de dentro dessa classe

entaum na tela quanto o usuario escolheu o produto, este foi setado para um objeto do tipo produtoempresa, que ira ser passada para o medoto existeProduto

o id que naum tem valor é o id da tabela produtoempresa mas o produto ja esta cadastrado, o que esta esta tendando validar é

nao vincular duas vezes o mesmo produto

para validar isso pode se usar chave composta para a tabela produtoempresa, a chave dessa tabela seria formada pelo idempresa e idproduto

quanto voce tentar inserir algo duplicado o banco valida para voce…

C

rir porque Hebert Coelho ?

pela explicacao que o dono do post passou é o que eu entendi…

10/12/2012 17:11:13 Assunto: Re:Produtos em duplicidade
Esqueci de falar.

Eu tenho um cadastro de produtos.
1 tinta
2 tijolo
3 areia

A empresa vai colocar o preço no produto.

Por exemplo.

Empresa 1

Tabela ProdutoEmpresa

1 cod produto = 1 preço 10.00 reais.

Empresa 2

Tabela ProdutoEmpresa
1 cod produto 2 preço 40.00 reais.

E assim vai.

Agora, se a empresa 1 quiser adicionar o mesmo produto, ela ta conseguindo e não pode ser.

Tipo.

2 cod produto = 1 preço 12.00 reais.

Ta vendo a duplicidade?

valeu

R

CristianPalmaSola10:
Na verdade pelo que entendi é isso

existe duas empresa
Empresa Urbainski
Empresa Sasaki

e o produto 1 - tijolo cadastrado no banco

na Empresa Urbainski o produto 1 custa 300 o milheiro

ai voce ira cadastrar na Empresa Sasaki o valor do produto 1 na sua empresa

voce poder reparar na restrictions que é feita a criteria na classe produtoempresa, o id do produto é usado de dentro dessa classe

entaum na tela quanto o usuario escolheu o produto, este foi setado para um objeto do tipo produtoempresa, que ira ser passada para o medoto existeProduto

o id que naum tem valor é o id da tabela produtoempresa mas o produto ja esta cadastrado, o que esta esta tendando validar é

nao vincular duas vezes o mesmo produto

para validar isso pode se usar chave composta para a tabela produtoempresa, a chave dessa tabela seria formada pelo idempresa e idproduto

quanto voce tentar inserir algo duplicado o banco valida para voce…

Bom, ele disse que está gravando um produto novo, mas se for como você disse, ainda está errado.

Para verificar duplicidade, ele teria que ver o id do produto e o id da empresa.

Se ele pesquisar um produto pelo id dele, é claro que ele irá retornar o registro, isso não acusa duplicidade nenhuma.

Agora um ProdutoEmpresa com o mesmo produto e a mesma empresa, aí sim existe duplicidade, pois é o mesmo produto para a mesma empresa.

C

foi uma das coisas que falei nesse post, parece que faltou um pouco de atenção de ambos os lados agora…

Faz o seguinte

view plaincopy to clipboardprint?

ProdutoEmpresa encontrado = (ProdutoEmpresa) session.createCriteria(ProdutoEmpresa.class)

.createAlias(produto)

.add(Restrictions.eq(id, produtoEmpresa.getProduto().getId()))

.uniqueResult();

da uma pesquisa no createAlias não me lembro exatamente dos parametros…

mas isso que voce esta fazendo deveria funcionar sim, mais uma coisa voce não deveria adicionar mais um where por id da empresa

se a empresa 1 cadastrar o preco do jeito que esta quando a validação funcionar a empresa dois não podera cadastrrar o preco pois a empresa 1 ja tem um registro na tabela em questao para aquele produto…

entendeu?

R

Eu acho é que faltou um ponto de interrogação na verdade, que mudou completamente o sentido da frase.

C

Nisso voce tem razão, da proxima vez serei mais atencioso, ate mais porque pelo jeito o problema principal dessa duvida ja foi sanada…

R

Hahahah, verdade. Eu acho engraçado quando o autor acaba sendo o cara menos ativo da própria thread.

1

Acho que eu expliquei errado.

Vamos lá.

Eu tenho um cadastro de produtos.
Id - nome

E tenho um cadastro de empresa.
id - nome

E fiz uma tabela produtoEmpresa

id - preço - cod_produto cod_empresa

Oks?

A empresa escolhe o produto, na lista de produtos e coloca o seu preço.
Isso já está funcionando.

O problema e que a empresa pode adicionar o mesmo produto, várias vezes. Isso está errado.

Eu alterei a consulta, mas está dando esse erro.

Tem como me ajudar?

Meu dao.

//Verifica se o produto já pertence aquela empresa
		public boolean existeProduto(ProdutoEmpresa produtoEmpresa) {
					ProdutoEmpresa encontrado = (ProdutoEmpresa) session.createCriteria(ProdutoEmpresa.class)
					.createCriteria("produto")
					.add(Restrictions.eq("id", produtoEmpresa.getProduto().getId()))
					.setMaxResults(1);
		return encontrado != null;
}

O erro.

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.ClassCastException: org.hibernate.internal.CriteriaImpl$Subcriteria cannot be cast to br.com.softsol.compresempre.modelo.ProdutoEmpresa

Valeus!

C

Amigo para eu poder lhe ajudar melhor poste a sua classe produtoempresa para mim ver que atributos ela possui e poder lhe dizer como fazer sua consulta…

C
ProdutoEmpresa encontrado = (ProdutoEmpresa) session.createCriteria(ProdutoEmpresa.class)  
                    .createAlias("produto","produto",Criteria.LEFT_JOIN)  
                    .add(Restrictions.eq("idProduto", produtoEmpresa.getProduto().getId()))  
                    .add(Restrictions.eq("idEmpresa", produtoEmpresa.getEmpresa().getId()))  
                    .uniqueResult();

Acho que com isso sua criteria fica certinha para essa situacao…

1

Cara continua dando erro.

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: org.hibernate.QueryException: could not resolve property: cod_produto of: br.com.softsol.compresempre.modelo.ProdutoEmpresa
Dao ficou assim.
ProdutoEmpresa encontrado = (ProdutoEmpresa) session.createCriteria(ProdutoEmpresa.class)    
                    .createAlias("produto","produto",Criteria.LEFT_JOIN)    
                    .add(Restrictions.eq("cod_produto", produtoEmpresa.getProduto().getId()))    
                    .add(Restrictions.eq("cod_empresa", produtoEmpresa.getEmpresa().getId()))    
                    .uniqueResult();

Meu controller

@Post("/produtoEmpresa")
	public void adiciona(ProdutoEmpresa produtoEmpresa) {

		if (dao.existeProduto(produtoEmpresa)) {
			validator.add(new ValidationMessage("Produto Já existe",
					"produtoEmpresa.produto.id"));
			validator.onErrorUsePageOf(ProdutoEmpresaController.class);
			//dao.salva(produtoEmpresa);
			result.redirectTo(ProdutoEmpresaController.class).lista();
		}else{

		dao.salva(produtoEmpresa);

		// Colocando o ProdutoEmpresa na Sessão
		ProdutoEmpresaEmProgresso.setSprodutoEmpresa(produtoEmpresa);

		// Redireciona para a página de administração
		result.redirectTo(AdministracaoController.class).empresa();
		}

	}

Minha classe ProdutoEmpresa;

import java.util.List;

import javax.persistence.CascadeType;
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.OneToMany;


@Entity
public class ProdutoEmpresa {
	
	//Variáveis
	@Id @GeneratedValue
	private Long id;
	private String quantidade_estoque;
	private double preco;
	private String ativo;
		
	//Relacionamento com Produto
		@ManyToOne
		@JoinColumn(name="cod_produto")
		private Produto produto;
	
	//Relacionamento com Empresa
		@ManyToOne
		@JoinColumn(name="cod_empresa")
		private Empresa empresa;
		
	//Relacionamento com Empresa
		@OneToMany(mappedBy = "produtoEmpresa",targetEntity= Item.class,
		fetch = FetchType.LAZY, cascade = CascadeType.ALL)
		private List<Item> item;
		
	
	//Método set e get
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getQuantidade_estoque() {
		return quantidade_estoque;
	}
	public void setQuantidade_estoque(String quantidade_estoque) {
		this.quantidade_estoque = quantidade_estoque;
	}
	public double getPreco() {
		return preco;
	}
	public void setPreco(double preco) {
		this.preco = preco;
	}
	public String getAtivo() {
		return ativo;
	}
	public void setAtivo(String ativo) {
		this.ativo = ativo;
	}
	public Produto getProduto() {
		return produto;
	}
	public void setProduto(Produto produto) {
		this.produto = produto;
	}
	public Empresa getEmpresa() {
		return empresa;
	}
	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}
	public List<Item> getItem() {
		return item;
	}
	public void setItem(List<Item> item) {
		this.item = item;
	}
C

Amigo preciso que voce poste as classes produto e empresa para poder escrever a consulta que voce precisa…

C

bom mas tenta o seguinte nesse meio tempo

ProdutoEmpresa encontrado = (ProdutoEmpresa) session.createCriteria(ProdutoEmpresa.class)      
                    .createAlias("produto","produto",Criteria.LEFT_JOIN)      
                    .add(Restrictions.eq("produto.cod_produto", produtoEmpresa.getProduto().getId()))      
                    .add(Restrictions.eq("empresa.cod_empresa", produtoEmpresa.getEmpresa().getId()))      
                    .uniqueResult();

acho que assim ta resolvido esse probleminha…

Criado 10 de dezembro de 2012
Ultima resposta 11 de dez. de 2012
Respostas 20
Participantes 4