Duvida em metodo pra gravar com relacionamento!

28 respostas
fred_cbranco

Fala pessoal deixa contextualizar vcs.
Tenho 3 entidades:
Produto
Cliente
Venda

A Venda precisa ter 1 produto e 1 cliente.

entao eu fiz a classe de modelo assim:

import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;

import javax.persistence.Table;


/**
 *
 * @author Fred
 */
@Entity
@Table(name="venda")
public class Venda {
    @Id
    @GeneratedValue
    private Long id;
    private Double valor;
    @OneToMany
    private List<Cliente> clientes;
    @OneToMany
    private List<Produto> produtos;

    public Venda(){

    }
    public Venda(Long id, Double valor, List<Cliente> clientes, List<Produto> produtos){
        this.id = id;
        this.valor = valor;
        this.clientes = clientes;
        this.produtos = produtos;

    }

    /**
     * @return the id
     */
    public Long getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return the valor
     */
    public Double getValor() {
        return valor;
    }

    /**
     * @param valor the valor to set
     */
    public void setValor(Double valor) {
        this.valor = valor;
    }

    /**
     * @return the clientes
     */
    public List<Cliente> getClientes() {
        return clientes;
    }

    /**
     * @param clientes the clientes to set
     */
    public void setClientes(List<Cliente> clientes) {
        this.clientes = clientes;
    }

    /**
     * @return the produtos
     */
    public List<Produto> getProdutos() {
        return produtos;
    }

    /**
     * @param produtos the produtos to set
     */
    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }


}

Ele me gera no banco alem das tabelas normais mais 2 tabelas que sao:
Cliente_venda e Produto Venda

A tabela venda so tem 1 campo que é Valor.

bom agora eu preciso fazer um metodo para popular estas entidades que foram criadas, hj eu so estou consequindo salva na tabela venda. usando o sequinte metodo:

public void adicionarVenda(){
        
        VendaDao dao = new VendaDaoImp();
        dao.save(venda);

    }

meu dao esta assim:

public void save(Venda venda) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        session.save(venda);
        t.commit();
    }

Gostaria de saber como fazer agora pra popular aquelas 2 entidades!
Obrigado!

28 Respostas

fred_cbranco

Alguem pessoal?

X

Não entendi muito bem oq vc quer…
Vc quer uma tabela para Venda, Cliente_venda, Produto Venda ???
Qual as colunas que ficaria em Cliente_Venda e Produto_venda ???

asandrob

Buenas, vejo um pequeno problema aqui.
Se venda precisa ter 1 Cliente e 1 Produto, então tua classe está errada, eu faria assim:

private Cliente cliente;
private Produto produto;

Da maneira que estás fazendo, tu diz que uma venda pode ter muitos clientes e muitos produtos, acho que o correto é que uma venda tenha 1 Cliente e muitos produtos. Então ficaria assim:

private Cliente cliente;
@OneToMany(mappedBy="cliente", cascade={CascadeType.ALL}) //considerando que Produto tem um atributo Cliente
private List<Produto> produtos;

Fazendo assim, quando instanciar uma venda e setar o cliente e os produtos, ao gravar será gravado tudo.

fred_cbranco

xandi_m5:
Não entendi muito bem oq vc quer…
Vc quer uma tabela para Venda, Cliente_venda, Produto Venda ???
Qual as colunas que ficaria em Cliente_Venda e Produto_venda ???

vamos la eu tenho a tabela cliente, produto e venda…
Ao efetuar uma venda preciso adicionar o cliente e o produto…

entao a classe venda ficou assim:

*/
@Entity
@Table(name="venda")
public class Venda {
    @Id
    @GeneratedValue
    private Long id;
    private Double valor;
    @OneToMany
    private List<Cliente> clientes;
    @OneToMany
    private List<Produto> produtos;

    public Venda(){

    }
    public Venda(Long id, Double valor, List<Cliente> clientes, List<Produto> produtos){
        this.id = id;
        this.valor = valor;
        this.clientes = clientes;
        this.produtos = produtos;

    }

    /**
     * @return the id
     */
    public Long getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return the valor
     */
    public Double getValor() {
        return valor;
    }

    /**
     * @param valor the valor to set
     */
    public void setValor(Double valor) {
        this.valor = valor;
    }

    /**
     * @return the clientes
     */
    public List<Cliente> getClientes() {
        return clientes;
    }

    /**
     * @param clientes the clientes to set
     */
    public void setClientes(List<Cliente> clientes) {
        this.clientes = clientes;
    }

    /**
     * @return the produtos
     */
    public List<Produto> getProdutos() {
        return produtos;
    }

    /**
     * @param produtos the produtos to set
     */
    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }


}

qando gero o banco ele me gera mais 2 tabelas a cliente_venda e a produto_venda.

eu nao estou conseguindo agora é fazer os metodos para popular estes caras ai.
So consigo popular a entidade venda.

fred_cbranco

asandrob:
Buenas, vejo um pequeno problema aqui.
Se venda precisa ter 1 Cliente e 1 Produto, então tua classe está errada, eu faria assim:

private Cliente cliente;
private Produto produto;

Da maneira que estás fazendo, tu diz que uma venda pode ter muitos clientes e muitos produtos, acho que o correto é que uma venda tenha 1 Cliente e muitos produtos. Então ficaria assim:

private Cliente cliente;
@OneToMany(mappedBy="cliente", cascade={CascadeType.ALL}) //considerando que Produto tem um atributo Cliente
private List<Produto> produtos;

Fazendo assim, quando instanciar uma venda e setar o cliente e os produtos, ao gravar será gravado tudo.

Hum nao tinha me atentado a isto vc esta certo.
agora como fazer o metodo pra gravar os produtos?

asandrob

Ai é que vem a parte “mágica”…
Quando tu gravar a venda com os produtos setados, tudo é gravado, não precisas gravar os produtos em separado…

Já leu algo sobre JPA/Hibernate?
Dá uma lida nesta apostila http://www.k19.com.br/downloads/apostilas-java/k19-k21-persistencia-com-jpa2-e-hibernate
Tenho certeza que vai de ajudar a entender melhor.

fred_cbranco

Bom mudei agora e esta assim:
o modelo

@Entity
@Table(name="venda")
public class Venda implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    private Double valor;
    
    private Cliente cliente;
    @OneToMany
    private List<Produto> produtos;

    public Venda(){

    }
    public Venda(Long id, Double valor, Cliente cliente, List<Produto> produtos){
        this.id = id;
        this.valor = valor;
        this.cliente = cliente;
        this.produtos = produtos;

    }

    /**
     * @return the id
     */
    public Long getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return the valor
     */
    public Double getValor() {
        return valor;
    }

    /**
     * @param valor the valor to set
     */
    public void setValor(Double valor) {
        this.valor = valor;
    }

    /**
     * @return the clientes
     */
    public Cliente getCliente() {
        return cliente;
    }

    /**
     * @param clientes the clientes to set
     */
    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    /**
     * @return the produtos
     */
    public List<Produto> getProdutos() {
        return produtos;
    }

    /**
     * @param produtos the produtos to set
     */
    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }


}

o dao

public void save(Venda venda) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        session.save(venda);
        t.commit();
    }

o controller

public void adicionarVenda(){
        
        VendaDao dao = new VendaDaoImp();
        dao.save(venda);

    }

e o jsf

<h:form prependId="false">
                <h:panelGrid id="infosVenda" columns="2" style="margin-bottom:10px">

                   

                    <h:outputLabel for="cliente" value="Cliente:" />
                    
                    <h:selectOneMenu  value="#{clienteController.cliente.nome}">
                        <f:selectItems value="#{clienteController.listarClientes}"/>
                    </h:selectOneMenu>

                    <h:outputLabel for="produto" value="Produto:" />

                    <h:selectOneMenu  value="#{produtoController.produto.descricao}">
                        <f:selectItems value="#{produtoController.listarProdutos}"/>
                    </h:selectOneMenu>

            
                    <h:outputLabel for="valor" value="Valor:" />
                    <h:inputText id="valor" value="#{vendaController.venda.valor}"/>

                    

                    <p:commandButton update="tabela" oncomplete="dialogGerVenda.hide();" actionListener="#{vendaController.adicionarVenda}" value="Inserir Venda"/>
                    <p:commandButton update="tabela" oncomplete="dialogGerVenda.hide();" actionListener="#{vendaController.alterarVenda}" value="Alterar Livro"/>

Ao salvar no campo cliente da tabela venda ele ta gravando assim:
[BLOB - 0Bytes]

Onde estou errando?
Obrigado

fred_cbranco

Com esta alteraçao a entidade cliente_venda nao tem mais.
creio que devo fazer alguma conversao pra ele passar a gravar o id do cliente no campo cliente.

asandrob

Estou neste momento com a apostila da K19 lendo o mapeamento que tú queres fazer.
Faz o download e lê, tá na página 17, 18 e 19!!!
Retirei todo o texto da apostila.

Suponha que no nosso domínio há duas entidades: Pedido e Cliente. As duas classes que
modelariam essas entidades seriam anotadas com as anotações principais de mapeamento.

@Entity
 class Pedido {
 @Id
 @GeneratedValue
 private Long id;
 }
@Entity
 class Cliente {
 @Id
 @GeneratedValue
 private Long id;
 }

Como existe um relacionamento entre pedidos e clientes devemos expressar esse vínculo
através de um atributo que pode ser inserido na classe PEDIDO. Supondo que um pedido
pertence a um único cliente, devemos utilizar um atributo simples para expressar esse relacionamento.

@Entity
 class Pedido {
 @Id
 @GeneratedValue
 private Long id;
 private Cliente cliente;
 }

Para informar a cardinalidade do relacionamento entre pedidos e clientes, devemos utilizar
a anotação @ManyToOne no atributo.

@Entity
 class Pedido {
 @Id
 @GeneratedValue
 private Long id;
@ManyToOne
 private Cliente cliente;
 }

No banco de dados, a tabela referente a classe PEDIDO possuíra uma join column vinculada
à tabela da classe CLIENTE. Por padrão, o nome da join column é a concatenação com ?_? da
entidade alvo do relacionamento com o nome da chave primária também da entidade alvo. No
exemplo de pedidos e clientes, o nome da join column seria cliente_id. Podemos alterar o
nome padrão das join columns aplicando a anotação @JoinColumn.

@Entity
 class Pedido {
 @Id
 @GeneratedValue
 private Long id;
@ManyToOne
 @JoinColumn(name="cli_id")
 private Cliente cliente;
 }

Repito, faz o download e estuda os mapeamentos.

fred_cbranco

amigo o relacionamento esta certinho, o problema é na hora de fazer o metodo no hibernate e no jsf para persistir
segue a classe

@Entity
@Table(name="venda")
public class Venda implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    private Double valor;
    
    @OneToOne
    private Cliente cliente;
    @OneToMany
    private List<Produto> produtos;

    public Venda(){

    }
    public Venda(Long id, Double valor, Cliente cliente, List<Produto> produtos){
        this.id = id;
        this.valor = valor;
        this.cliente = cliente;
        this.produtos = produtos;

    }

    /**
     * @return the id
     */
    public Long getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return the valor
     */
    public Double getValor() {
        return valor;
    }

    /**
     * @param valor the valor to set
     */
    public void setValor(Double valor) {
        this.valor = valor;
    }

    /**
     * @return the clientes
     */
    public Cliente getCliente() {
        return cliente;
    }

    /**
     * @param clientes the clientes to set
     */
    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    /**
     * @return the produtos
     */
    public List<Produto> getProdutos() {
        return produtos;
    }

    /**
     * @param produtos the produtos to set
     */
    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }


}

Foi gerado na entidade venda o campo id_cliente

fred_cbranco

segue meu msn pra se caso alguem puder me ajudar, preciso disso com muita urgencia, dependo disso pra ser promovido rsss
[email removido]

asandrob

Como que está sendo gravado agora?

fred_cbranco

ao gravar o campo id_cliente traz null

fred_cbranco

no meu jsf estou buscando assim:

<h:outputLabel for="cliente" value="Cliente:" />
                    
                    <h:selectOneMenu  value="#{clienteController.cliente.nome}">
                        <f:selectItems value="#{clienteController.listarClientes}"/>
                    </h:selectOneMenu>

ele esta me trazendo o nome correto dos clientes ai chamo o metodo que vai gravar

<p:commandButton update="tabela" oncomplete="dialogGerVenda.hide();" actionListener="#{vendaController.adicionarVenda}" value="Inserir Venda"/>

este metodo

public void adicionarVenda(){
        
        VendaDao dao = new VendaDaoImp();
        dao.save(venda);

    }
X

Asandrob
Quando eu salvo, no meu BD as colunas fica em uma ordem da qual eu não quero… Tem como mudar a ordem das colunas?

asandrob

Onde que tá o venda.setCliente(xxxx) ?????

public void adicionarVenda(){   
         
       VendaDao dao = new VendaDaoImp();   
       //coloca isso aqui e vê a saída
       System.out.println();
       //
       dao.save(venda);   
  
   }

Se não for setado cliente em venda, o valor será null

asandrob

Ops,

System.out.println(venda.getCliente);

fred_cbranco

é cara ta trazendo null mesmo.
onde que eu coloco aquele codigo?

asandrob

xandi_m5:
Asandrob
Quando eu salvo, no meu BD as colunas fica em uma ordem da qual eu não quero… Tem como mudar a ordem das colunas?

Talvez até tenha… (nunca precisei)
Mas isso é relavante??? Já que pode fazer isso no select…

fred_cbranco

onde eu adiciono o venda.setCliente(xxxx)?

fred_cbranco

fiz assim com o metodo

public void adicionarVenda(){
        venda.setCliente(cliente);
        VendaDao dao = new VendaDaoImp();
        System.out.println(venda.getCliente());
        dao.save(venda);

    }

mais mesmo assim ele traz nulo

asandrob

fred_cbranco:
fiz assim com o metodo

public void adicionarVenda(){
        venda.setCliente(cliente);
        VendaDao dao = new VendaDaoImp();
        System.out.println(venda.getCliente());
        dao.save(venda);

    }

mais mesmo assim ele traz nulo

Eu não sou especialista em desenvolvimento Web, mas aparentemente está faltando alguma coisa, onde estão os ManagedBeans.
Quer me passar o código para eu TENTAR olhar?
Mas não prometo nada… rsrsrs

[email removido]

fred_cbranco

asandrob:
fred_cbranco:
fiz assim com o metodo

public void adicionarVenda(){
        venda.setCliente(cliente);
        VendaDao dao = new VendaDaoImp();
        System.out.println(venda.getCliente());
        dao.save(venda);

    }

mais mesmo assim ele traz nulo

Eu não sou especialista em desenvolvimento Web, mas aparentemente está faltando alguma coisa, onde estão os ManagedBeans.
Quer me passar o código para eu TENTAR olhar?
Mas não prometo nada… rsrsrs

[email removido]


foi obrigado!

asandrob

fred_cbranco:
asandrob:
fred_cbranco:
fiz assim com o metodo

public void adicionarVenda(){
        venda.setCliente(cliente);
        VendaDao dao = new VendaDaoImp();
        System.out.println(venda.getCliente());
        dao.save(venda);

    }

mais mesmo assim ele traz nulo

Eu não sou especialista em desenvolvimento Web, mas aparentemente está faltando alguma coisa, onde estão os ManagedBeans.
Quer me passar o código para eu TENTAR olhar?
Mas não prometo nada… rsrsrs

[email removido]


foi obrigado!

Só por curiosidade, tú já fez algo com JSF? Ou esse é teu primeiro projeto?

fred_cbranco

tudo que eu fiz ate hj foi sem relacionamento.
Nunca fiz nada com relacionamentos
por isso estou quebrando cabeça

asandrob

Bah, JSF 2.0… Nossa eu aprendi 1.2 e faz tempo que não mexo nisso…

Dei uma lida rápida nos meus manuais, e acho que é aqui que o JSF faz o setCliente em Venda:

<h:outputLabel for="cliente" value="Cliente:" />   
                       
                    <h:selectOneMenu  value="#{vendaController.cliente}">   //alterar aqui
                        <f:selectItems value="#{clienteController.listarClientes}"/>   
                    </h:selectOneMenu>

só não sei se não vais precisar de um converter, para transformar o string em objeto Cliente.

fred_cbranco

asandrob:
Bah, JSF 2.0… Nossa eu aprendi 1.2 e faz tempo que não mexo nisso…

Dei uma lida rápida nos meus manuais, e acho que é aqui que o JSF faz o setCliente em Venda:

<h:outputLabel for="cliente" value="Cliente:" />   
                       
                    <h:selectOneMenu  value="#{vendaController.cliente}">   //alterar aqui
                        <f:selectItems value="#{clienteController.listarClientes}"/>   
                    </h:selectOneMenu>

só não sei se não vais precisar de um converter, para transformar o string em objeto Cliente.

Se eu coloco assim como passou nada acontece nao grava nao faz nada, nem log ele gera
Seu eu coloco

<h:selectOneMenu  value="#{vendaController.cliente.nome}">

Ele traz null
se coloco

<h:selectOneMenu  value="#{vendaController.cliente.id}">

tambem nao acontece nada

fred_cbranco

E ai pessoal nada?

Criado 10 de janeiro de 2012
Ultima resposta 10 de jan. de 2012
Respostas 28
Participantes 3