Relacionamento e um para muitos
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();
}
}
@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
Curtidas 0
Respostas
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 ?
Mas para ser mais exato, em qual linha o erro ocorre ?
GOSTEI 0
Adriano Aguiar
15/07/2014
Boa tarde Ronaldo o erro está ocorrendo nessa linha:
produto.getProdutoLoja().add(produtoLoja);
grato!
produto.getProdutoLoja().add(produtoLoja);
grato!
GOSTEI 0
Ronaldo Lanhellas
15/07/2014
Adicione este código antes:
if (produto.getProdutoLoja() == null) {
produto.setProdutoLoja(new ArrayList<ProdutoLoja>());
}
GOSTEI 0
Adriano Aguiar
15/07/2014
Ele grava os dados na tabela produto mais em ProdutoLoja não.
GOSTEI 0
Ronaldo Lanhellas
15/07/2014
Esse é outro problema ? O problema do NULLPOINTER foi resolvido com o código acima ?
GOSTEI 0
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
15/07/2014
Eu percebi que você não está setando o produto dentro de produtoLoja, tente fazer o seguinte:
Teste e me diga se funcionou.
produtoLoja.setProduto(produto); produto.getProdutoLoja().add(produtoLoja);
Teste e me diga se funcionou.
GOSTEI 0
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);
produtoLoja.setProduto(produto);
if (produto.getProdutoLoja() == null) {
produto.setProdutoLoja(new ArrayList<ProdutoLoja>());
}
produtoDAO.addProduto(produto);
GOSTEI 0
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);
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
15/07/2014
Opa deu certo, muito obrigado, queria que você me explicassem essa linha produto.setProdutoLoja(new ArrayList<ProdutoLoja>());
grato!
grato!
GOSTEI 0
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 ?
Entendeu ?
GOSTEI 0
Adriano Aguiar
15/07/2014
sim, valeu obrigado.
GOSTEI 0
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.
<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