Relacionamentos hibernate

Boa tarde, sou iniciante e tenho muitas duvidas.
Vou coloca-las aos poucos para não ficar muito emboladas.
Estou fazendo um aplicativo para facul de um controle de uma loja de materiais de construcao.
Tenho dúvidas na hora de fazer os relacionamentos, onde colocar uma para muitos, muitos para um, muitos para muitos.

vamos lá.:

classe compras

@ManyToOne
    @JoinColumn(name="fornecedor_id")
    @Cascade(CascadeType.ALL)
    private fornecedor fornecedor_id;

estou configurando para muitas compras para um fornecedor.

classe fornecedor

@OneToMany(mappedBy="fornecedor_id")
    @Cascade(CascadeType.ALL)
    private Set<compra> compra_id; 

Esta certo afirmar que UM fornecedor para muitas compras? ja que para cada compra realizada tera um fonecedor.
Realmente preciso colocar o relacionamento na classe fornecedor?

Depois posto mais dúvidas.
Muito obrigado

Meu caro, não tente pensar estruturado tratando de objetos. Nem vice-versa.
Isole as coisas.

Cada compra será feita de um fornecedor? Essa compra se refere a uma NF?
Cada fornecedor poderá estar em várias compras. Mas cada compra só pdoerá ter um forncecedor, não?
Relacionamento um para muitos.
No banco, você colocaria uma FK de fornecedor em Compra e boas. Todas as vezes que quisesse encontrar um fornecedor, a partir da venda, conseguiria e, caso contrário, pesquisasse as compras por fornecedor, também.

O mapeamento unidirecional permite que apenas a classe que contém esse mapeamento realize as ações. Por isso, precisa do mapeamento bidirecional (caso queira deletar fornecedor ou compra, precisará destes dados).

Ok, drsmachado.
Vou fazer o relacionamento bidirecional neste caso.

vou colocar um @ManyToOne na classe compras, muitas compras para um fornecedor e,
@OneToMany na classe fornecedor, um fornecedor para cada compra.

Aproveitando sua ajuda, agradeço muitissimo mesmo, gostaria de tirar mais duvidas.

Classes Itens_vendas e produtos.

Na classe Itens_venda

    @ManyToOne
    @JoinColumn(name="produto_id")
    @Cascade(CascadeType.ALL)
    private produto produto_id;

Esta certo?
Estou dizendo que, varias instancias de itens_venda podem ter somente um produto (pode ser o mesmo)?

E na classe produto? Como seria esse relacionamento de Produto com itens_venda?

Muito obrigado pela ajuda, Valeu mesmo.

Eu entendo que um item_venda pode conter apenas um produto, embora a quantidade seja variável (1 ou mais).
Assim sendo, por que um relacionamento muitos para um?
pesquise pelo mappedBy aí você consegue fazer o mapeamento unidirecional

O relacionamento é muitos para um (muitos itens_venda para um produto), pois podera ter varios itens de venda com o mesmo produto, em vendas diferentes.
Estou certo ou errado (por favor pode falar).
O mappedBy é usado em relacionamentos @OneToMany ? Estou certo?
ele é uma chave estrangeira, que pega o valor da classe do outro lado do relacionamento?

Nesse caso, onde um item_venda podera conter apenas um produto, mas com quaantidades entre 1 e infinito.
Qual o relacionamento usar?

@ManuToOne OU @OneToMany?

Estou perdido…
Mais uma vez muito obrigado pela resposta e atenção.

Você está confundindo as coisas.
Se formos analisar mais adequadamente, item_venda, é, nada mais, que um produto.
Cada produto pode estar em n vendas. Cada venda pode ter n produtos.

item_venda = produto
Logo, item_venda 1 : 1 produto.

Mas

item_venda n : n venda

Isto é,

produto n : n venda

Como o relacionamento n : n prevê a criação de uma tabela associativa, você precisa mapear isso em ambos os lados.
Como você pretende colocar um outro objeto entre as classes envolvidas, isso muda um pouco.
Eu optaria por abordar desta forma

/*Classe Venda*/
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="item_venda", joinColumns=(
   @JoinColumn(name="venda_id" referencedColumn="id", inverseJoinColumnw={@JouinColumn(name="produto_id", referencedColumn="id"}
))
private List<Produto> produtos;
/*Classe Produto*/
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="item_venda", joinColumns=(
   @JoinColumn(name="produto_id" referencedColumn="id", inverseJoinColumnw={@JouinColumn(name="venda_id", referencedColumn="id"}
))
private List<Venda> vendas;

O hibernate irá criar (caso você tenha configurado para isso) as tabelas
vendas
produtos
item_venda
Onde, em vendas serão armazenadas todas as vendas.
Em produtos, todos os produtos.
E em item_venda todas as associações entre eles.
item_venda terá as columnas venda_id e produto_id, referenciando o id de venda e de produto, respectivamente.

ok, entendi, foi muito claro.
E se eu quiser colocar mais colunas nessa terceira tabela que o hibernate ira criar, colunas como, quantidade, valor total e talvez valor do produto teria como?
Porque quando se tem um relacionamento muitos para muitos o hibernate cria uma tabela associativa automaticamente, tem como adicionar campos a essa tabela? Se sim, como e onde eu especifico esses campos?

Muito obrigado

Aqui tem um exemplo bem detalhado sobre esta questão.
É plenamente possível.
http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/

Eu nao entendi muito bem, pelo que eu vi, o exemplo usa AssociationOverrides.
No exemplo nao esta sendo usado ManyToMany.

Tem como voce me mostrar como poderia fazer isso com minhas classes Venda, Intes_venda e produtos?

A classe itens_venda sera a classe criada pelo hibernate para assiciar uma venda a um produto.
Preciso de mais 2 campos na classe itens_venda, quantidade e valor total.

Itens venda

cod_venda | cod_produto | quantidade | valor_total

Se tiver como me mostrar como fazer os relacionamentos, ficarei muito grato.
Muito obrigado

dsmachado, tenho uma dúvida, pode ajudar?

este é o link da minha postagem, estava mesmo perdido, confesso, apreciaria muito uma mão…

http://www.guj.com.br/java/286346-problema-com-persistencia-em-uma-determinada-entidade#1513514