Seguinte amigos, estou tentando fazer um mapeamento mas so consigo adicionar sem a chave estrangeira e quando mapeio de outro jeito pra colocar a chave estrangeira manualmente da erro.
Eu tenho as classes Produto e Fornecedor. Quando eu mapeio a classe da seguinte forma, ele da erro pq tento colocar a FK manualmente:
Produto
@ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn (name="idfornecedor")
private int idfornecedor;
E se eu tentar fazer o mapeamento da forma abaixo, ele insere na tabela, mas sem a FK, pq fornecedor não é um tipo de valor, entao como vou add um fornecedor colocando um int?
ate da certo quando coloco o codigo, não cheguei a adicionar a FK mas o eclipse nao mostrou erro. Só que mapeado dessa forma eu não consigo adicionar um fornecedor porque ocorre esse erro:
Ele mapeado dessa forma duplica a coluna com a PK do proprio fornecedor. Veja a classe Fornecedor:
[code]@Entity
public class Fornecedor {
@Id @GeneratedValue
private long idfornecedor;
private String nome;
private int cnpj;
@ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn (name="idfornecedor")
private Produto produto;
public long getIdfornecedor() {
return idfornecedor;
}
public void setIdfornecedor(long idfornecedor) {
this.idfornecedor = idfornecedor;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public int getCnpj() {
return cnpj;
}
public void setCnpj(int cnpj) {
this.cnpj = cnpj;
}
public Produto getProduto() {
return produto;
}
public void setProduto(Produto produto) {
this.produto = produto;
}
}[/code]
viu? ele diz q private long idfornecedor; e @JoinColumn (name=“idfornecedor”) são duas colunas iguais. E agora? =/
Vc não precisa necessariamente de uma fk…vc precisa de uma coluna q receba, um inteiro por exemplo ( nao precisa ter o papel de fk )
Isso ai vc vai salvar na tabela Produto, certo? Na tabela produto, tem um id_fornecedor lá, não é? Vc não pode usar a mesma referencia para as columns e os ids, experimenta mudar o nome da coluna do seu relacionamento…coloca:
Daeh padcoe, blz?
Eu fiz o que vc falou no fornecedor e estou conseguindo adicionar fornecedor de boa.
Mas voltando agora aquele exemplo que você me deu pra adicionar idfornecedor em produto, ele não coloca a FK.
O código que você me passou foi o seguinte:
Produto p = new Produto();
p.setFornecedores(new ArrayList());
p.getFornecedores().add(new Fornecedor());
p.getFornecedores().get(0).setId(1);
eu tentei colocar o id do fornecedor no lugar do 1 no setId mas nao deu certo pq ele adicionou 0 na tabela. E quando tentei colocar o id do fornecedor em get, ele deu o seguinte erro:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 1
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at br.com.caelum.hibernate.AdicionaProduto.main(AdicionaProduto.java:23)
Esse ai é o codigo que eu estou usando pra tentar adicionar o produto com a FK:
[code]public class AdicionaProduto {
public static void main(String[] args) {
Session session = new HibernateFactory().getSession();
Produto p = new Produto();
p.setNome ("Pen driver 10GB");
p.setDescricao("branco");
p.setPreco(69.99);
p.setFornecedores(new ArrayList());
p.getFornecedores().add(new Fornecedor());
p.getFornecedores().get(6).setIdfornecedor(6);
ProdutoDAO produtoDAO = new ProdutoDAO(session);
produtoDAO.salva(p);
//session.beginTransaction();
//session.save(p);
//session.getTransaction().commit();
System.out.println("ID do produto:" + p.getId());
session.close();
}
}[/code]
se eu deixar o get com 0 do jeito que você me disse ate vai, mas grava a FK como 0, tendeu? Eu deixo 0 no get e no setIdfornecedor eu coloco 6 que é o id e grava 0.