Duvida relacionamento JPA

6 respostas
R

Amigos,

supondo que eu tenha um relacionamento 1:N,como mostro abaixo:
public class A {


  @OneToMany(mappedBy="a")
  private List<B> bs;
  private Integer aCode;
   
}

public class B {
  
 @ManyToOne(cascade=CascadeType.PERSIST)
 @JoinColumn(name="B_A_code")
 private A a;    
 
}
Estou em duvida com relação ao mapeamento no lado N.O certo seria:
private A a;
Ou seria?
private Integer bACode
,por exemplo?

Grato

6 Respostas

normandesjr

Amigo,

O certo seria a primeira opção, ou seja:

private A a;

Você deve fazer o mapeamento da classe e não do atributo!

Abraços.

R

Perfeito…

Agora suponhamos que ao inserir um objeto B eu precise especificar o código do objeto A ao qual B se refere:

<h:selectOneMenu value="#{b.a.aCode}">

seria isso?

Grato

normandesjr

Não, não seria isso. Deixa eu tentar te explicar.

Você simplesmente precisa setar o objeto A no objeto B. Existem muitas formas de se fazer isso, seguindo o exemplo que você sitou de um selectOneMenu, ficaria:

<h:selectOneMenu value="#{seuBean.b.a}" converter="aConverter"/>

O converter “aConverter” é especificado no faces-config.xml e serve para você converter seu objeto em String - para ele “aparecer” na tela; e de String para seu objeto - para poder utilizá-lo como um objeto.

Assim você setará no objeto B o objeto A e, devido ao seu mapeamento, ele saberá que quando for persistir os dados ele deve pegar o Id do objeto A e montar o insert do objeto B com este Id de A.

É isso ae… não sei se ficou bem claro. A idéia do conversor é simples, é só você implementar Converter, implementando os métodos getAsObject e getAsString.

Qualquer dúvida estou a disposição.

Abraços.

R

Ficou claro sim cara… :smiley:

Grato pela atenção :wink:

S
normandesjr:
Não, não seria isso. Deixa eu tentar te explicar.

Você simplesmente precisa setar o objeto A no objeto B. Existem muitas formas de se fazer isso, seguindo o exemplo que você sitou de um selectOneMenu, ficaria:

<h:selectOneMenu value="#{seuBean.b.a}" converter="aConverter"/>

O converter "aConverter" é especificado no faces-config.xml e serve para você converter seu objeto em String - para ele "aparecer" na tela; e de String para seu objeto - para poder utilizá-lo como um objeto.

Assim você setará no objeto B o objeto A e, devido ao seu mapeamento, ele saberá que quando for persistir os dados ele deve pegar o Id do objeto A e montar o insert do objeto B com este Id de A.

É isso ae.. não sei se ficou bem claro. A idéia do conversor é simples, é só você implementar Converter, implementando os métodos getAsObject e getAsString.

Qualquer dúvida estou a disposição.

Abraços.

Oi pessoal !! Normandes o que você falou ficou bem claro e foi o que ja tentei fazer mas da mensagem de valor inválido.
Poderia me ajudar por favor ? Estou utilizando JSF RI 1.2 da Sun.
Ja implementei o getAsObject e getAsString como segue abaixo:

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;

import com.leucotron.updateServer.control.ATLParameterDAO;

public class ParamConverter implements Converter {
	
// Actions ------------------------------------------------------------------------------------
    
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        
        return ATLParameterDAO.getParam(Integer.parseInt(value));
    }

    public String getAsString(FacesContext context, UIComponent component, Object value) {
    	return ((AtlParameter)value).getId().toString();
    }

}

e o metodo da minha Action que preenche a lista do selectOneMenu:

public String inputRegras() {
		Debug.print("ATLAction.input() :: SUCCESS");
		f_rule = new AtlRule();
		
		f_params = ATLParameterDAO.getList();
		paramSel = new ArrayList<SelectItem>();
		for(AtlParameter temp : f_params)
			paramSel.add(new SelectItem(temp, temp.getName()));
		
				
		return "formRegras";
	}

e a minha view:

<h:outputLabel value="Parâmetro" /><h:selectOneMenu value="#{atlAction.paramx}">
			<f:selectItems value="#{atlAction.paramSel}"/>
			<f:converter converterId="paramConvert" />
		</h:selectOneMenu>

A mensagem de erro é:

12/11/2007 09:23:16 com.sun.faces.lifecycle.RenderResponsePhase execute
INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=j_id_jsp_2018985718_4:j_id_jsp_2018985718_23[severity=(ERROR 2), summary=(j_id_jsp_2018985718_4:j_id_jsp_2018985718_23: Validation Error: Value is not valid), detail=(j_id_jsp_2018985718_4:j_id_jsp_2018985718_23: Validation Error: Value is not valid)]

Se alguem puder ajudar desde ja agradeço..
Valeu pessoal !!!

M

Acho que o problema pode estar em como você monta o SelectItem.

Você passa temp como primeiro argumento. Não seria temp.getId() ? Ou temp.toString()?

De repente está sendo setado em value a referência do objeto…

abs

Criado 28 de outubro de 2007
Ultima resposta 11 de dez. de 2007
Respostas 6
Participantes 4