E ai galera,
estou utlizando 2 chaves estrangeiras como chaves da minha tabela, porém na hora de usar isso no formulário é um tanto chato para passar dois campos, estive pensando em implementar Serializeble, porém, não sei como fazer para transformar o meu embeddebleID para o formulario.
Meu código:
@Entity
@Table(name = "Fornecedor_MateriaPrima") /* 245999857460995074L */
public class MateriaPrimaFornecedor implements Serializable{
private static final long serialVersionUID = -245999857460995074L;
@EmbeddedId
private MateriaPrimaFornecedorPK id;
private String codigo;
Minha ID
@Embeddable
public class MateriaPrimaFornecedorPK implements Serializable{
private static final long serialVersionUID = 504213857862593268L;
@ManyToOne(optional = false)
private MateriaPrimaFabricante materiaPrima;
@ManyToOne(optional = false)
private Fornecedor fornecedor;
Bom, pois é gostaria de passar para o meu formulário, o MateriaPrimaFabricante e Fornecedor no mesmo campo.
#comofaz?
Abraços!
o serializable só vai funcionar se vc serializar o objeto e colocar dentro de uma string…
se o que vc só precisa é dos ids do fornecedor e da materiaPrima vc pode fazer o seguinte:
-sobrescreva o toString da PK para retornar os dois ids, por ex separados por vírugla
-crie um converter do vraptor que pega esses dois ids e transforma na pk desejada
Nesse caso faria um converter de String para MateriaPrimaFornecedorPK
tipo isso?
package br.com.rhfactor.converter;
import java.util.ResourceBundle;
import br.com.caelum.vraptor.Convert;
import br.com.caelum.vraptor.Converter;
import br.com.rhfactor.quimiflex.entidade.MateriaPrimaFornecedorPK;
@Convert(value = MateriaPrimaFornecedorPK.class)
public class MateriaPrimaFornecedorConverter implements Converter<MateriaPrimaFornecedorPK>{
@Override
public MateriaPrimaFornecedorPK convert(String valor, Class<? extends MateriaPrimaFornecedorPK> tipo, ResourceBundle bundle) {
MateriaPrimaFornecedorPK pk = new MateriaPrimaFornecedorPK();
String[] ids = valor.split(",");
Long fornecedorId = (Long) Long.parseLong(ids[0].trim());
Long materiaPrimaId = (Long) Long.parseLong(ids[0].trim());
pk.getFornecedor().setId(fornecedorId);
pk.getMateriaPrima().setId(materiaPrimaId);
return pk;
}
}
Porém, como uso isso?
kkkkkkkkkkkkkkkk
só tem algum campo num formulário ou coisa do tipo:
materiaPrimaFornecedor.id=33,55
Bom, Estou mesmo sem saber por onde começar!
Criei o Converter:
@ApplicationScoped
@Convert(value = MateriaPrimaFornecedorPK.class)
public class MateriaPrimaFornecedorConverter implements Converter<MateriaPrimaFornecedorPK>{
@Override
public MateriaPrimaFornecedorPK convert(String valor, Class<? extends MateriaPrimaFornecedorPK> tipo, ResourceBundle bundle) {
MateriaPrimaFornecedorPK pk = new MateriaPrimaFornecedorPK();
String[] ids = valor.split(",");
Long fornecedorId = (Long) Long.parseLong(ids[0].trim());
Long materiaPrimaId = (Long) Long.parseLong(ids[0].trim());
pk.getFornecedor().setId(fornecedorId);
pk.getMateriaPrima().setId(materiaPrimaId);
return pk;
}
}
E na minha classe PK Adicionei o método toString
@Embeddable
public class MateriaPrimaFornecedorPK implements Serializable{
private static final long serialVersionUID = 504213857862593268L;
@ManyToOne(optional = false)
private MateriaPrimaFabricante materiaPrima;
@ManyToOne(optional = false)
private Fornecedor fornecedor;
@Override
public String toString() {
return this.fornecedor.getId() + "," + this.materiaPrima.getId();
}
Porém, no meu método no controller
@Post
@Path("/fornecedores/produtos/")
public void adicionarProduto(MateriaPrimaFornecedor materiaPrimaFornecedor) {
System.out.println(materiaPrimaFornecedor.getId());
}
o valor desse syso é NULL.
como tá o formulário? o @Convert é do VRaptor?
O formulario está fornecedor.materiaPrimaFornecedor.id pois ha um cascade ai para o fornecedor.
se o parâmetro do controller é materiaPrimaFornecedor, no formulário deveria estar só materiaPrimaFornecedor.id