Fórum Dúvida com relacionamento @OneToMany #506223

04/01/2015

0

Boa noite preciso saber como usar o relacionamento @OneToMany com jsf no meu clienteBean criei o objeto Endereco não sei se é o certo, logo abaixo está o código:

public class Cliente implements Serializable {

private static final long serialVersionUID = 7797550805039262611L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;

@OneToMany(mappedBy = "cliente", cascade = { CascadeType.ALL,
CascadeType.PERSIST, CascadeType.MERGE })
private List<Endereco> endereco;

}

@Table(name = "endereco")
public class Endereco implements Serializable {
private static final long serialVersionUID = -312317668584983632L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;

@ManyToOne
@JoinColumn(name = "id_cliente")
@NotNull
private Cliente cliente;
}

//Bean

@ManagedBean(name = "clienteBean")
@ViewScoped
public class ClienteBean implements Serializable {

private static final long serialVersionUID = -8802432823573476989L;

@EJB
private ClienteEJB clienteEJB;
private Cliente cliente;
@Inject
private Endereco endereco;

public String cadastraCliente() {

endereco.setCliente(cliente);
if (cliente.getEndereco() == null) {
cliente.setEndereco(new ArrayList<Endereco>());
}

cliente.getEndereco().add(endereco);

this.clienteEJB.adiciona(cliente);

FacesMessage fm = new FacesMessage("Sucesso ao cadastrar a cliente "
+ cliente.getNome());
fm.setSeverity(FacesMessage.SEVERITY_INFO);
FacesContext.getCurrentInstance().addMessage("form", fm);
cliente = new Cliente();

return null;

}
}


//Cliente
<p:inputText value="#{clienteBean.cliente.nome}" id="nome" size="50" required="true" requiredMessage="Informe o nome do cliente"></p:inputText>
//Endereço
<p:inputText id="complemento" value="#{clienteBean.endereco.complemento}" size="50" required="true" requiredMessage="Informe o complemento" />
Adriano Aguiar

Adriano Aguiar

Responder

Posts

05/01/2015

Ronaldo Lanhellas

Sim, aparentemente sua lógica está correta, um cliente tem diversos endereços e um endereço é de apenas 1 cliente. Alguma dúvida ou erro nela ?
Responder

Gostei + 0

05/01/2015

Adriano Aguiar

não está ocorrendo nenhum erro quero verifica se a chamada no jsf está correto, por que quando eu vou editar na parte do endereço fica em branco:

<p:inputText id="complemento" value="#{clienteBean.endereco.complemento}" size="50" required="true" requiredMessage="Informe o complemento" />
Responder

Gostei + 0

07/01/2015

Adriano Aguiar

Bom dia pessoal não sei se entenderam minha dificuldade, estou com essa duvida e como chamar a entidade endereco na minha pagina JSF?
Responder

Gostei + 0

07/01/2015

Ronaldo Lanhellas

Bom eu não vi em nenhum momento você carregando o objeto cliente no seu ManagedBean. Então provavelmente o cliente não está sendo carregado.

Mas se você estiver carregando ele em outro ponto e apenas não mostrou o método, checa se no seu SQL ou Hql você está fazendo fetch da entidade endereço dentro do objeto cliente.
Responder

Gostei + 0

07/01/2015

Adriano Aguiar

Estou carregando ele dessa forma:

@ManagedBean(name = "clienteBean")
@ViewScoped
public class ClienteBean implements Serializable {

private static final long serialVersionUID = -8802432823573476989L;

@EJB
private ClienteEJB clienteEJB;
private Cliente cliente;
@Inject

private Endereco endereco;

}

@Dependent
@Entity
@Table(name = "cliente")
public class Cliente implements Serializable {

private static final long serialVersionUID = 7797550805039262611L;


@OneToMany(mappedBy = "cliente", cascade = { CascadeType.ALL,
CascadeType.PERSIST, CascadeType.MERGE })
private List<Endereco> endereco;

}

@Dependent
@Entity
@Table(name = "endereco")
public class Endereco implements Serializable {
private static final long serialVersionUID = -312317668584983632L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;

@ManyToOne(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name = "id_cliente")
private Cliente cliente;
}

JSF

<h:outputLabel value="Rua:" />
<p:inputText id="rua" value="#{clienteBean.cliente.endereco.rua}" size="50" required="true" requiredMessage="Informe o nome da rua!" />
Responder

Gostei + 0

08/01/2015

Ronaldo Lanhellas

VocÊ só mostrou as entidades e parte do managedBean. Como disse, em nenhum momento você está carregando o objeto "cliente" do ClienteBean.

Deveria ter algum método como:

public void loadCliente(){
 cliente = getClienteFromId(10);
}
Responder

Gostei + 0

08/01/2015

Adriano Aguiar

Eu seleciono desta forma, passando objeto cliente:

public void selecionarCliente(Cliente cliente) {
this.cliente = cliente;
}
Responder

Gostei + 0

08/01/2015

Ronaldo Lanhellas

Eu seleciono desta forma, passando objeto cliente:

public void selecionarCliente(Cliente cliente) {
this.cliente = cliente;
}


Então neste momento o cliente não deve ter o endereco carregado, deve estar como LAZY. Na sua HQL faça um fetch no campo endereco do cliente.
Responder

Gostei + 0

08/01/2015

Ronaldo Lanhellas

Eu seleciono desta forma, passando objeto cliente:

public void selecionarCliente(Cliente cliente) {
this.cliente = cliente;
}


Então neste momento o cliente não deve ter o endereco carregado, deve estar como LAZY. Na sua HQL faça um fetch no campo endereco do cliente.
Responder

Gostei + 0

08/01/2015

Adriano Aguiar

Ele está carregando o endereço mas ao chamar no jsf ocorre erro veja como estou fazendo:

<p:inputText id="bairro" value="#{clienteBean.cliente.endereco.bairro}" required="true" requiredMessage="Informe O bairro da Empresa" />

//erro

/ UI Layout Initialization Error
The center-pane element does not exist.
The center-pane is a required element.
Responder

Gostei + 0

09/01/2015

Ronaldo Lanhellas

Ele está carregando o endereço mas ao chamar no jsf ocorre erro veja como estou fazendo:

<p:inputText id="bairro" value="#{clienteBean.cliente.endereco.bairro}" required="true" requiredMessage="Informe O bairro da Empresa" />

//erro

/ UI Layout Initialization Error
The center-pane element does not exist.
The center-pane is a required element.


O erro descrito não tem nada haver com o "endereco" e sim com o layout da sua página. Tente encapsular sua página desta forma:

<p:layoutUnit position="center">
 Seu conteúdo aqui
</p:layoutUnit>
Responder

Gostei + 0

09/01/2015

Ronaldo Lanhellas

Ele está carregando o endereço mas ao chamar no jsf ocorre erro veja como estou fazendo:

<p:inputText id="bairro" value="#{clienteBean.cliente.endereco.bairro}" required="true" requiredMessage="Informe O bairro da Empresa" />

//erro

/ UI Layout Initialization Error
The center-pane element does not exist.
The center-pane is a required element.


O erro descrito não tem nada haver com o "endereco" e sim com o layout da sua página. Tente encapsular sua página desta forma:

<p:layoutUnit position="center">
 Seu conteúdo aqui
</p:layoutUnit>
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar