Uma filial posui um produto - relacionamento @OneToOne - e um produto possui vários históricos.
A tabela produto é a seguinte:
public class Produto implements Serializable {
private static final long serialVersionUID = 1L;
public final static String ALL = "produto.populaproduto";
public final static String COUNT = "produto.countprodutoTotal";
public final static String DESCRICAO = "produto.descricao";
private Long codigo;
private Integer Version;
private String codigoProduto;
private String descricao;
private BigDecimal valor;
private Empresa empresa;
private Linha linha;
private Usuario gerenteFilial;
private Double fatorAmortecimentoExponencial;
private Long quantidadeRecente;
private BigDecimal quantidadeReais;
private List<Historico> historicos = new ArrayList<>();
@OneToMany(mappedBy = "produto", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
public List<Historico> getHistoricos() {
return historicos;
}
public void setHistoricos(List<Historico> historicos) {
this.historicos = historicos;
}
public Produto() {
}
public Produto(String codigoProduto, String descricao, BigDecimal valor) {
this.codigoProduto = codigoProduto;
this.descricao = descricao;
this.valor = valor;
}
@Version
public Integer getVersion() {
return Version;
}
public void setVersion(Integer version) {
Version = version;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getCodigo() {
return codigo;
}
public void setCodigo(Long codigo) {
this.codigo = codigo;
}
@NotBlank
@Column(nullable = false, length = 50)
public String getCodigoProduto() {
return codigoProduto;
}
public void setCodigoProduto(String codigoProduto) {
this.codigoProduto = codigoProduto;
}
public void setDescricao(String descricao) {
this.descricao = descricao == null ? null : descricao.toUpperCase().trim();
}
@NotBlank
@Column(nullable = false, length = 100)
public String getDescricao() {
return descricao;
}
@Column(name = "valor", nullable = false, precision = 10, scale = 2)
public BigDecimal getValor() {
return valor;
}
public void setValor(BigDecimal valor) {
this.valor = valor;
}
@Column(name = "fatorAmortecimentoExponencial", nullable = true, precision = 10, scale = 2)
public Double getFatorAmortecimentoExponencial() {
return fatorAmortecimentoExponencial;
}
public void setFatorAmortecimentoExponencial(Double fatorAmortecimentoExponencial) {
this.fatorAmortecimentoExponencial = fatorAmortecimentoExponencial;
}
@Column(name = "quantidade_recente")
public Long getQuantidadeRecente() {
return quantidadeRecente;
}
public void setQuantidadeRecente(Long quantidadeRecente) {
this.quantidadeRecente = quantidadeRecente;
}
@Column(name = "quantidade_reais", nullable = true, precision = 10, scale = 2)
public BigDecimal getQuantidadeReais() {
return quantidadeReais;
}
public void setQuantidadeReais(BigDecimal quantidadeReais) {
this.quantidadeReais = quantidadeReais;
}
@ManyToOne
@JoinColumn(name = "codigo_empresa")
public Empresa getEmpresa() {
return empresa;
}
public void setEmpresa(Empresa empresa) {
this.empresa = empresa;
}
@OneToOne
@JoinColumn(name = "codigo_linha")
public Linha getLinha() {
return linha;
}
public void setLinha(Linha linha) {
this.linha = linha;
}
@ManyToOne
@JoinColumn(name = "codigo_filial")
public Usuario getGerenteFilial() {
return gerenteFilial;
}
public void setGerenteFilial(Usuario gerenteFilial) {
this.gerenteFilial = gerenteFilial;
}
Ao persistir produto:
Double alfa = BigDecimal.valueOf((fatorAmortecimentoExponencial(arrayComUltimosCincoMeses)))
.setScale(3, RoundingMode.HALF_UP).doubleValue();
System.out.println("Alfa " + alfa);
System.out.println("Melhor taxa: " + alfa + " - resultado: "
+ Math.round(calculoPrevisao(alfa.doubleValue(), arrayComQuantidades)));
Long previsao = Math.round(calculoPrevisao(alfa.doubleValue(), arrayComQuantidades));
listaComCincoUltimosMeses.clear();
listaComQuantidade.clear();
prod.setEmpresa(empresaSelecionada);
prod.setGerenteFilial(gerenteFilial);
prod.setFatorAmortecimentoExponencial(alfa);
prod.setQuantidadeRecente(previsao);
prod.setQuantidadeReais(prod.getValor().multiply(new BigDecimal(previsao)));
cadastroProdutoService.salvar(prod);// persistir após
// calcular o
// alfa
Ocorre o seguinte erro:
object references an unsaved transient instance - save the transient instance before flushing : br.com.previsao.model.Produto.linha -> br.com.previsao.model.Linha