Relacionamento [RESOLVIDO]

Olá pessoal, estou com sérias dificuldades sobre relacionamento unidirecional, estou usando hibernate annotations mas, está complicado.

[code]@Entity
@Table(name = “fornecedor”, schema = “mercado”)
public class Fornecedor implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_fornecedor")
private int idFornecedor;

@OneToOne(mappedBy = "fornecedor", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Collection<Produto> produtos = new Array<Produto>();

@Entity
@Table(name = “produto”, schema = “mercado”)
public class Produto implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_produto")
private int idProduto;

@JoinColumn(name = "fornecedor_id")
private Fornecedor fornecedores;

[/code]

como faço para que ao entrar com dados do fornecedor ele atribua o valor do ‘idFornecedor’ em ‘fornecedorId’???

Se é uma coleçao não pode ser OneToOne…

use OneToMany ou ManyToMany

Quando vc adcionar o fornecedor ao banco, o banco tera o trabalho de gerar o ID, e o hibernate vai ajustar o valor do campo no objeto, assim que vc criar o fornecedor…

para isso no banco o campo deve id_fornecedor deve estar auto_incrase

Ok mas,
eu preciso fazer @OneToOne, vc tem alguma dica???
Os meus cabelos agradeçem!!!

[quote=Renato_natos]Ok mas,
eu preciso fazer @OneToOne, vc tem alguma dica???
Os meus cabelos agradeçem!!![/quote]

C eu estou entendendo bem… não é OneToOne e sim OneToMany …

um Fornecedor so pode te fornecer 1 produto ???

ou um Fornecedor pode te fornecer N produtos ??

OneToMany ker dizer que… um fornecedor contem varios produtos e que um produto contem apenas um fornecedor…

e la antes do JoinColum do produto vc colocaria… @ManyToOne para indicar que vc pode ter varios produtos apontando para um unico fornecedor,

ah sim desculpe,
exatamente isso @OneToMany

então isto que está me confundindo

eu fiz um formulário para preencher campos da tabela fornecedor e produto.
Minha intenção é que na hora que for salvar, ele salve o fornecedor atribua o valor da PK na FK que está na tabela produto e salve o produto. É possivel?

a minha estrutura está assim:

@Entity
@Table(name = "fornecedor", schema = "mercado")
public class Fornecedor implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_fornecedor")
	private int idFornecedor;
	
	@OneToMany(mappedBy = "fornecedor", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	private Collection<Produto> produtos = new ArrayList<Produto>();
	
	@Column(name = "nome_fornecedor")
	private String nomeFornecedor;
	
	@Column(name = "cidade_fornecedor")
	private String cidadeFornecedor;
	
	public void salvaProduto(Produto produto){
		produtos.add(produto);
	}

getters e setters

-------------------------------------------------

@Entity
@Table(name = "produto", schema = "mercado")
public class Produto implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_produto")
	private int idProduto;
	
	@ManyToOne(cascade = CascadeType.ALL)
	@JoinColumn(name = "fornecedor_id", referencedColumnName = "id_fornecedor")
	private Fornecedor fornecedores;
	
	@Column(name = "nome_produto")
	private String nomeProduto;
	
	@Column(name = "setor_produto")
	private String setorProduto;
	
	private String descricao;
	
	private int quantidade;

método do managed beans


public class FornecedorMB {
	private Fornecedor fornecedor = new Fornecedor();
	private Produto produto = new Produto();
	private FornecedorService service = new FornecedorService(); 
	
	private String cidadeFornecedor;
	private String nomeProduto;
	
	public String salvar(){
		fornecedor.setCidadeFornecedor(cidadeFornecedor);
		produto.setNomeProduto(nomeProduto);
		fornecedor.salvaProduto(produto);
		service.salvar(fornecedor);
		
		return null;
	}

mude isso

public void salvaProduto(Produto produto){ produto.setFornecedor(this); produtos.add(produto); }

e saiba que é preciso salvar o fornecedor antes!, caso contrario, não havera a chave primaria para salvar os produtos

Obs… o nome salvaProduto não esta legal… visto que o produto nao esta sendo salvo, e sim adcinoado…
Obs2… nao sei como vc implementou o service.salvar(fornecedor) mais neste caso, vc deve salvar o fornecedor e depois percorrer todos os produtos e salvar cada produto, isso para a forma como vc esta abordando

Bom dia,

Fiz esta alteração que foi dita mas aparece um outro erro:

“mappedBy reference an unknown target entity property: entidade.Produto.fornecedor in entidade.Fornecedor.produtos”;

Não imagino o que pode ser, vc pode me ajudar com este erro?

[quote=Renato_natos]Bom dia,

Fiz esta alteração que foi dita mas aparece um outro erro:

“mappedBy reference an unknown target entity property: entidade.Produto.fornecedor in entidade.Fornecedor.produtos”;

Não imagino o que pode ser, vc pode me ajudar com este erro?[/quote]

o poder de um “s”

“mappedBy reference an unknown target entity property: entidade.Produto.fornecedor in entidade.Fornecedor.produtos”;

//...
public class Fornecedor implements Serializable{
//...
	//aqui vc colocou fornecedor , sem estar no plural
	@OneToMany(mappedBy = "fornecedor", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	private Collection<Produto> produtos = new ArrayList<Produto>();
//...
}
//...
public class Produto implements Serializable{
//...
	private Fornecedor fornecedores; // <== aki ta escrito fornecedores (no plural) tem um "s" a mais que no mappedBy
	//como não são fornecedores e sim fornecedor, acredito que tirar o "s" daqui seja a melhor solução
//...
}

Ok, corrigi esta linha e salvou, mas salvou o fornecedor e o produto sem nenhum vínculo, ou seja, ele não atribuiu o id do fornecedor na chave estrangeira.
Vc têm alguma idéia de onde esteja meu erro?
Muito obrigado pela atenção!!!

Puts…Consegui finalmente…
Muito obrigado pela sua ajuda!!!
Tive que corrigir aquele ‘s’ e incluir uma linha de comando
vlw.

[quote=Renato_natos]Puts…Consegui finalmente…
Muito obrigado pela sua ajuda!!!
Tive que corrigir aquele ‘s’ e incluir uma linha de comando
vlw.[/quote]

sempre bom editar a msg principal, e colocar um [RESOLVIDO] depois do titulo, pra o pessoal saber que não precisa + de ajuda para este problema, e pra caso alguem pesquise sobre o mesmo problema, ao ver o titulo saber que o seu problema esta resolvido ^^

Ok, já providenciei.
Até mais!!