Boa noite.
Sou novo aqui no fórum como participante e estou há dias lutando com o hibernate.
Estou utilizando essa mesma ideia no meu desenvolvimento (uma Venda tem vários ItensVenda e uma Compra tem várias EntradaProduto) com JSF + MySQL + Hibernate.
Seguem meus códigos das classes Compra e EntradaProduto:
@Entity
public class Compra implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(nullable=false, name="data_da_entrada")
@Temporal(javax.persistence.TemporalType.DATE)
Date dataDaEntrada;
@Column(nullable=false, name="valor_total")
BigDecimal valorTotal;
@OneToOne(fetch=FetchType.LAZY)
@ForeignKey(name="fornecedor_fk")
Fornecedor fornecedor;
@OneToOne(fetch=FetchType.LAZY)
@ForeignKey(name="funcionario_fk")
private Funcionario funcionario;
@OneToMany(fetch=FetchType.EAGER)
@Cascade(CascadeType.ALL)
private List <EntradaProduto> entradas = new ArrayList();
// getters, setters, equals, hashCode, toString...
@Entity
public class EntradaProduto implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(nullable=false, name="preco_de_compra")
private BigDecimal precoDeCompra;
@Column(nullable=false)
private Integer quantidade;
@ForeignKey(name="produto_fk")
@OneToOne
private Produto produto;
// getters, setters, equals, hashCode, toString...
O Hibernate criou para mim as tabelas Compra, EntradaProduto e Compra_EntradaProduto.
Estou usando o trecho de código (num controller) abaixo para cadastrar uma compra no banco; Ele insere direitinho nas tabelas Compra e EntradaProduto mas não insere nada na tabela associativa: (também atualiza os produtos direitinho)
Session session = HibernateUtil.currentSession() == null ? HibernateUtil.openSession() : HibernateUtil.currentSession();
DAO<Produto> daop = new DAO<Produto>(session, Produto.class);
ProdutoDAO pdao = new ProdutoDAO(daop, session);
DAO<EntradaProduto> daoe = new DAO<EntradaProduto>(session, EntradaProduto.class);
EntradaProdutoDAO edao = new EntradaProdutoDAO(daoe, session);
compra.setDataDaEntrada(new Date());
compra.setEntradas(listaDeEntradas);
compra.setFornecedor(fornecedor);
compra.setFuncionario(lc.getFuncionario());
BigDecimal vTotal = new BigDecimal(BigInteger.ZERO);
for (int i = 0; i < listaDeEntradas.size(); i++) {
EntradaProduto ent = listaDeEntradas.get(i);
edao.save(ent);
Produto p = ent.getProduto();
Integer q = p.getEstoque() + ent.getQuantidade();
p.setEstoque(q);
pdao.merge(p);
vTotal = vTotal.add(ent.getPrecoDeCompra().multiply(BigDecimal.valueOf(ent.getQuantidade())));
}
DAO<Compra> daoc = new DAO<Compra>(session, Compra.class);
CompraDAO cdao = new CompraDAO(daoc, session);
compra.setValorTotal(vTotal);
cdao.save(compra);
compra = new Compra();
listaDeEntradas.clear();
todasAsCompras = null;
Agora, com esse código (num arquivo com main onde populo o banco) ele faz tudo certinho, inclusive na tabela associativa:
EntradaProduto ep1 = new EntradaProduto();
EntradaProduto ep2 = new EntradaProduto();
Compra c = new Compra();
List<EntradaProduto> lista = new ArrayList();
Fornecedor fo = fodao.load(Long.valueOf("1"));
ep1.setProduto(pdao.load(Long.valueOf("1")));
ep1.setQuantidade(10);
ep1.setPrecoDeCompra(BigDecimal.valueOf(1.00));
ep2.setProduto(pdao.load(Long.valueOf("2")));
ep2.setQuantidade(10);
ep2.setPrecoDeCompra(BigDecimal.valueOf(13.00));
lista.add(ep1);
lista.add(ep2);
edao.save(ep1);
edao.save(ep2);
c.setDataDaEntrada(new Date());
c.setEntradas(lista);
c.setFornecedor(fo);
c.setFuncionario(fdao.load(Long.valueOf("1")));
BigDecimal vTotal = new BigDecimal(BigInteger.ZERO);
for (int i = 0; i < lista.size(); i++) {
EntradaProduto item = lista.get(i);
vTotal = vTotal.add(item.getPrecoDeCompra().multiply(BigDecimal.valueOf(item.getQuantidade())));
}
c.setValorTotal(vTotal);
cdao.save(c);
session.flush();
O que estou fazendo de errado?
Estou desesperado!
Grato.