Valores errados vindo do banco

3 respostas
F

Boa tarde.

Tô com um problema ao trazer objetos de uma tabela… Os valores da coluna saldo que estão no banco são um, mas se eu testo na aplicação, com um dialog ou debug, o valores são outro.
Não sei se o problema tem a ver com o flush da session… Já testei de todas as formas e nada de vir corretamente. Estranho é que todas as outras listagens vêm corretamente.

Não sei se tem alguma relação, mas esse objeto que tá vindo com o saldo errado tem um relacionamento many-to-many assim:

Empenho:

@OneToMany(mappedBy = "chave.empenho")
public List<EmpenhoNotaFiscal> getLigacoes() {
    if (ligacoes == null)
        ligacoes = new ArrayList<>();
	return Collections.unmodifiableList(ligacoes);
    }
public void setLigacoes(List<EmpenhoNotaFiscal> ligacoes) {
	this.ligacoes = new ArrayList<>(ligacoes);
}

NotaFiscal:

@OneToMany(mappedBy = "chave.notaFiscal")
public List<EmpenhoNotaFiscal> getLigacoes() {
    if (ligacoes == null)
        ligacoes = new ArrayList<>();
	return Collections.unmodifiableList(ligacoes);
    }
public void setLigacoes(List<EmpenhoNotaFiscal> ligacoes) {
	this.ligacoes = new ArrayList<>(ligacoes);
}

Classe associativa entre elas duas:

@Entity
public class EmpenhoNotaFiscal {

	@EmbeddedId
	private EmpenhoNotaFiscalPK chave;
	private BigDecimal valor;
	
	// ############# \\
	public EmpenhoNotaFiscalPK getChave() {
		return chave;
	}
	public void setChave(EmpenhoNotaFiscalPK chave) {
		this.chave = chave;
	}
	
	public BigDecimal getValor() {
		return valor;
	}
	public void setValor(BigDecimal valor) {
		this.valor = valor;
	}
	
}

PK da classe associativa:

@Embeddable
public class EmpenhoNotaFiscalPK implements Serializable{

	private static final long serialVersionUID = 1L;

	@ManyToOne(cascade = CascadeType.ALL)
	private Empenho empenho;
	
	@ManyToOne(cascade = CascadeType.ALL)
	private NotaFiscal notaFiscal;

	// ############# \\
	public Empenho getEmpenho() {
		return empenho;
	}
	public void setEmpenho(Empenho empenho) {
		this.empenho = empenho;
	}

	public NotaFiscal getNotaFiscal() {
		return notaFiscal;
	}
	public void setNotaFiscal(NotaFiscal notaFiscal) {
		this.notaFiscal = notaFiscal;
	}
	
}

Tá mapeado corretamente?

O meu método salvar do dao:

public void salvar(T entidade) {
        if (entidade == null) {
            throw new IllegalArgumentException();
        }
        Session sessao = pegarSessao();
        Transaction transacao = sessao.beginTransaction();
        try {
            sessao.saveOrUpdate(entidade);
            transacao.commit();
        } catch (ConstraintViolationException e) {
            transacao.rollback();
            throw e;
        } finally {
            sessao.close();
        }
    }

3 Respostas

F

O valor de “saldo” ao instanciar um objeto Empenho é o igual ao valor do mesmo, mas ao vincular uma NotaFiscal a um Empenho, esse saldo é subtraido do valor da NF.

Ao inserir a NF:

dao.salvar(entidade); // salva a NF
DAOEmpenho daoEmpenho = new DAOEmpenho();
for (Empenho e : emps)
    daoEmpenho.atualizar(e); // atualiza cada empenho (com o saldo mudado)
tela.adicionarEntidadeTabela(entidade);
F

Galera, o que está acontecendo é isso aqui (com a diferença que ele mostra a diferença de situações mudando a forma de geração do ID, que no meu caso é um EmbeddedId com 2 objetos):

Mas como resolver, pra esse caso de * to *?

F

Alguém tem um exemplo parecido com o meu, de um relacionamento muitos-pra-muitos com uma tabela associativa com um atributo a mais, que funcione?

Criado 3 de julho de 2012
Ultima resposta 9 de jul. de 2012
Respostas 3
Participantes 1