Ola Pessoal, ja postei outros topicos com a mesma duvida porem nao soube me explicar bem. Vamos la. O meu problema eh o seguinte:
Tenho o seguinte relacionamento no banco de dados |Produto| 1------* |LeilaoItens| *--------1 |Leilao|. Os atributos da tabela ficao da seguinte forma
Produto
ID
NOME
PRECO
Leilao
ID
DATA
CLIENTE
LeilaoItens
PedidoID
ProdutoID
Quantidade
O codigo java para as classes
@Entity
@Table(name = "Produto")
@NamedQueries({})
public class Produto implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ProdutoID", nullable = false)
private Integer produtoID;
@Column(name = "EAN", nullable = false)
private long ean;
@Column(name = "Descricao", nullable = false)
private String descricao;
@Column(name = "PrecoCompra")
private Double precoCompra;
@Column(name = "PrecoCusto")
private Double precoCusto;
@Column(name = "PrecoVenda")
private Double precoVenda;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "produto")
private Collection<LeilaoItens> leilaoItensCollection;
public class Leilao implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "LeilaoID", nullable = false)
private Integer leilaoID;
@Column(name = "DataLeilao")
@Temporal(TemporalType.DATE)
private Date dataLeilao;
@Column(name = "Descricao")
private String descricao;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "leilao")
private Collection<LeilaoItens> leilaoItensCollection;
@Entity
@Table(name = "LeilaoItens")
@NamedQueries({})
public class LeilaoItens implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
protected LeilaoItensPK leilaoItensPK;
@Column(name = "Quantidade")
private Integer quantidade;
@JoinColumn(name = "LeilaoID", referencedColumnName = "LeilaoID", insertable = false, updatable = false)
@ManyToOne
private Leilao leilao;
@JoinColumn(name = "ProdutoID", referencedColumnName = "ProdutoID", insertable = false, updatable = false)
@ManyToOne
private Produto produto;
@Embeddable
public class LeilaoItensPK implements Serializable {
@Column(name = "LeilaoID", nullable = false)
private int leilaoID;
@Column(name = "ProdutoID", nullable = false)
private int produtoID;
Leilao leilao = new Leilao();
leilao.setDataLeilao(new Date());
leilao.setDescricao("Bebidas");
leilao.setLeilaoItensCollection(new ArrayList<LeilaoItens>());
Query q = em.createQuery("select object(o) from Produto as o");
Collection<Produto> prods = q.getResultList();
for(Produto p : prods) {
System.out.println("Produto: " + p.getDescricao() + "\n");
LeilaoItens item = new LeilaoItens();
item.setLeilaoItensPK(new LeilaoItensPK());
item.setProduto(p);
item.setLeilao(leilao);
item.setQuantidade(100);
leilao.getLeilaoItensCollection().add(item);
if(p.getLeilaoItensCollection()==null)
p.setLeilaoItensCollection(new ArrayList<LeilaoItens>());
p.getLeilaoItensCollection().add(item);
}
em.persist(leilao);
O problema:
A chave da tabela LeilaoItens eh composta(LeilaoID, ProdutoID) e depende do valor da chave primaria do leilao que eh gerada por auto incremento. Qando eu monto o objeto leilao e dou o persist() ele da erro pois o valor da chave primaria do LeilaoItens nao pode ser setada pois nao tenho ainda o valor o autoincremento do LeilaoID. Como resolver esse problema?
Alternativas:
Posso dar um select max(id) no Leilao. Posso persistir o leilao e depois os itens. Posso criar uma chave primaria autoincremento na tabela LeilaoItens e passar qualquer valor no objeto que da certo.
Mas se eu fizer assim nao estaria usando a filozofia do JPA e voltaria a trabalhar com o modelo relacional. Alguem conhece a solucao correta?