Problema com persistencia em cascata, alguem pode ajudar?

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?

é uma boa pergunta, eu tb gostaria de saber a resposta. Passei por um problema parecido, e resolvi da maneira que vc fez.

a chave natural é a única saída q vc tem?

Quando um problema não tem solução, o mais fácil é destruir o problema.

No seu caso, a chave natural está lhe causando o problema.

Chaves compostas, mesmo q naturais são sempre fontes de problemas. Não sei das regras do seu negócio, mas considere utilizar uma chave secundária (não natural) como seu id. Veja se a sua regra de negócio suporta.

Obs: chave natural é composta por atributos que tem relação com a entidade. Chaves secundárias são compostas por informações não relevantes a entidade - por exemplo, um campo auto-incremento.

Completando …

O JPA tem como finalidade mitigar os problemas do desenvolvimento no que tange a persistenia. No meu entendimento, esta é a filosofia. Reduzir problemas e não criar novos.