Erro em salvar Cascade

7 respostas
robertouba

Galera, tarde!
Estou com o seguinte problema.

Formula possui lista de Quantidade.
Porém as quantidades podem conter várias vezes o mesmo item.

Ordem de produção possui lista de Quantidades (outra classe).
Porém não podem duplicar os itens.

Logo se as quantidades na fórmula são repetidas eu as devo somar, para poder fazer uma quantidade única na produção.

Criei um método que me retorna uma lista de quantidades, porém ao salvar minha ordem de produção a minha formula é alterada também.

// Verificar Quantidade
	Formula formulaDB = this.formulaDao.load(ordemProducao.getFormula().getId());

	
	List<Quantidade> lstQuantidade = new ArrayList<Quantidade>();
	
	//Metodo que traz as quantidades unificadas
	this.getEstoque(formulaDB, lstQuantidade, ordemProducao.getQuantidadeSolicitada());

        //Lista de quantidade da Ordem de Produção
	List<OrdemPesagem> lstPesagens = new ArrayList<OrdemPesagem>();

	for (Quantidade quantidade : lstQuantidade) {

	    if (!quantidade.getProdutoQuimico().isProdutoFaturado()) {
		// Verificar os estoques válidos - CompraEntregaItem e a
		// quantidade de cada item
		List<CompraEntregaItem> estoques = this.materiaPrimaDao.estoqueValido(quantidade.getProdutoQuimico(), quantidade.getQuantia());

		// Adicionar a lista as quantidade retornadas
		for (CompraEntregaItem c : estoques) {
		    OrdemPesagem o = new OrdemPesagem();
		    o.setQuantidadeSolicitada(c.getQuantidadeOrdemProducao());
		    o.setCompraEntregaItem(c);
		    o.setDataSolicitada(Calendar.getInstance());
		    o.setOrdemProducao(ordemProducao);
		    o.setStatus(PesagemStatus.RESERVADA);
		    lstPesagens.add(o);
		}
	    }
	    else {
		// Quanto o produto é faturado, não é necessário verificar o
		// estoque
		OrdemPesagem o = new OrdemPesagem();
		o.setQuantidadeSolicitada(quantidade.getQuantia());
		o.setCompraEntregaItem(null);
		o.setDataSolicitada(Calendar.getInstance());
		o.setOrdemProducao(ordemProducao);
		o.setStatus(PesagemStatus.RESERVADA);
		lstPesagens.add(o);
	    }
	}

	// Criar Ordem de Produção
	ordemProducao.setSolicitante(this.usuarioLogado.getUsuario());
	ordemProducao.setFormula(formulaDB);
	ordemProducao.setPesagens(lstPesagens);
	this.ordemProducaoDao.save(ordemProducao);
	this.result.include("sucesso", true);
	this.result.redirectTo(this).listar();

Verificando minhas classes, a ordem de produção, não tem relacionamento com a Formula_Quantidade (Classe: Quantidade)
Logo, não consegui identificar porque está salvando ela em cascade.

A única ligação está aqui, mas mesmo assim eu não relacionei nada em cascade.

@Entity
@DiscriminatorValue("BASE")
public class OrdemProducaoBase extends OrdemProducao{

    @ManyToOne(optional = true)
    private Formula formula;

7 Respostas

J

Olá Roberto.

Obtem a Formula como detached.

Abs

D

Provavelmente o relacionamento deve ter assumido o cascade padão que não é o que você quer…
Você pode tentar setar um(ou mais de uma ao mesmo tempo) pra ver se resolve.
cascade = CascadeType.MERGE
ou
cascade = {CascadeType.MERGE, CascadeType.DETACH }

robertouba

Não tenho encontrado a biblioteca para CascadeType.DETACH.
Eu uso o Hibernate, e nunca usei JPA (se é que me entendem, apesar de saber da implementação).
Gostaria de saber como fazer da maneira mais rápida… :smiley:

D

Não entendi bem o que vc, quis dizer com isso, de não ter encontrado a biblioteca eu também uso hibernate direto e aqui ela aparece para mim normal.
Provalvemente está faltando algum jar no teu projeto então.

Mas mesmo usando hibernate você deve usar esse import:
import javax.persistence.CascadeType;

robertouba

Poxa, o CascadeType.DETACH não tem nas minhas bibliotecas!
Por isso comentei, eu vou testar agora umas configurações para JPA.

robertouba
import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

@Entity
@DiscriminatorValue("BASE")
public class OrdemProducaoBase extends OrdemProducao{

    @ManyToOne(optional = true, cascade = CascadeType.DETACH)
    private Formula formula;

Minhas bibliotecas:

O que está faltando? Pois ainda não consegui ainda anotar com CascadeType.DETACH no meu @ManyToOne de Fórmula.

robertouba

Galera eu fiz o seguinte código.
Gostaria de saber se funciona desta maneira.

public T loadReadOnly(Long id){
	T t = (T) this.session.get(this.oClass, id);
	this.session.setReadOnly(t, true);
	return t;
    }
Criado 3 de junho de 2012
Ultima resposta 10 de jun. de 2012
Respostas 7
Participantes 3