Relacionamento e um para muitos

Java

15/07/2014

Boa tarde a todos estou com problema de utilizar relacionamento de um para muito, ao inserir está dando NullPointer, segue o código abaixo:

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

private static final long serialVersionUID = 1L;

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

@Column(name = "Descricao")
private String descricao;


@OneToMany(mappedBy = "produto", cascade = { CascadeType.ALL,
CascadeType.PERSIST, CascadeType.MERGE })
private List<ProdutoLoja> produtoLoja;


//Tabela produlo Loja

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

@ManyToOne
@JoinColumn(name = "id_produto")
@NotNull
private Produto produto;



//bean

@ManagedBean(name = "produto")
@RequestScoped
public class ProdutoBean {

private Produto produto;
ProdutosDAO produtoDAO = new ProdutosDAO();
ProdutosLojaDAO plDAO = new ProdutosLojaDAO();
private List<Produto> produtos;
private ProdutoLoja produtoLoja = new ProdutoLoja();
private List<Foto> fotos;

public ProdutoBean() {
this.novo();
}

public void novo() {
produto = new Produto();
produtoLoja = new ProdutoLoja();
}

public void salvar() {
FacesContext fc = FacesContext.getCurrentInstance();
if (produto.getId() == null) {

produto.getProdutoLoja().add(produtoLoja);
produtoDAO.addProduto(produto);
novo();
FacesMessage facesMessage = new FacesMessage(
"Produto cadastrado com Sucesso! ");
fc.addMessage(null, facesMessage);

} else {
produtoDAO.updateProduto(produto);
FacesMessage facesMessage = new FacesMessage(
"Produto alterado com Sucesso! ");
fc.addMessage(null, facesMessage);
novo();


}

}
Adriano Aguiar

Adriano Aguiar

Curtidas 0

Respostas

Ronaldo Lanhellas

Ronaldo Lanhellas

15/07/2014

Tem certeza que o método "novo()" está sendo chamado ? Imagino que não por isso o erro.

Mas para ser mais exato, em qual linha o erro ocorre ?
GOSTEI 0
Adriano Aguiar

Adriano Aguiar

15/07/2014

Boa tarde Ronaldo o erro está ocorrendo nessa linha:

produto.getProdutoLoja().add(produtoLoja);

grato!
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

15/07/2014

Adicione este código antes:

 if (produto.getProdutoLoja() == null) {
    produto.setProdutoLoja(new ArrayList<ProdutoLoja>());
 }
GOSTEI 0
Adriano Aguiar

Adriano Aguiar

15/07/2014

Ele grava os dados na tabela produto mais em ProdutoLoja não.
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

15/07/2014

Esse é outro problema ? O problema do NULLPOINTER foi resolvido com o código acima ?
GOSTEI 0
Adriano Aguiar

Adriano Aguiar

15/07/2014

Ronaldo, você pode me orientar onde estou errando, pois se uso cascade era para está dando erro?
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

15/07/2014

Eu percebi que você não está setando o produto dentro de produtoLoja, tente fazer o seguinte:

produtoLoja.setProduto(produto);
produto.getProdutoLoja().add(produtoLoja);


Teste e me diga se funcionou.
GOSTEI 0
Adriano Aguiar

Adriano Aguiar

15/07/2014

não deu certo veja como ficou

produtoLoja.setProduto(produto);

if (produto.getProdutoLoja() == null) {
produto.setProdutoLoja(new ArrayList<ProdutoLoja>());
}


produtoDAO.addProduto(produto);
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

15/07/2014

não deu certo veja como ficou

produtoLoja.setProduto(produto);

if (produto.getProdutoLoja() == null) {
produto.setProdutoLoja(new ArrayList<ProdutoLoja>());
}


produtoDAO.addProduto(produto);


mas está errado, você tem por todo código, veja:

produtoLoja.setProduto(produto);
if (produto.getProdutoLoja() == null) {
        produto.setProdutoLoja(new ArrayList<ProdutoLoja>());
}			
produto.getProdutoLoja().add(produtoLoja);
produtoDAO.addProduto(produto);
GOSTEI 0
Adriano Aguiar

Adriano Aguiar

15/07/2014

Opa deu certo, muito obrigado, queria que você me explicassem essa linha produto.setProdutoLoja(new ArrayList<ProdutoLoja>());


grato!
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

15/07/2014

Acontece que você criou o objeto produto mas a lista de "produtoLoja" que estava dentro do objeto produto, não foi criada/instanciada. Quando você tenta fazer um "add(produtoLoja)" recebe NullPointerException porque a lista não foi instanciada.

Entendeu ?
GOSTEI 0
Adriano Aguiar

Adriano Aguiar

15/07/2014

sim, valeu obrigado.
GOSTEI 0
Adriano Aguiar

Adriano Aguiar

15/07/2014

Boa tarde Ronaldo, surgiu uma duvida será que estou fazendo correto com jsf, para inserir está dando certo, quando vou editar mostra na tela de cadastro somente os dados do produto, Produto Loja fica vazio para resolver no método que chamo pagina editar tenho que fazer select passando codigo do produto e retornar produtoLoja, veja como estou fazendo abaixo:


<p:inputText value="#{produto.produto.descricao}" size="50"
required="true" requiredMessage="Informe a descricao do produto"></p:inputText>

<p:inputText value="#{produto.produtoLoja.valor_venda}" size="10"
required="true" requiredMessage="Informe o Valor de Venda"></p:inputText>


public String doUpdateProduto() {
produtoLoja = plDAO.getProdutoPLoja(produto.getId());
return "produtos";
}

grato.
GOSTEI 0
POSTAR