Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

problema ao criar a foreign key

Como posso incluir uma nota fiscal com o com o id do cliente para que eu possa identificar as notas fiscais sempre que forem emitidas para aquele determinado cliente? Agradeceria ajuda. E também outra pergunta seria correto fazer primeiro uma pesquisa para verificar se o cliente digitado pelo usuário existe, caso afirmativo, continuar o cadastramento da nota e caso contrário informar que o cliente não existe, se isso for correto, como poderia especificar isso no meu DAO?

digitar-nf.xhtml

<h:form>
        <div class="form-group row">
            <label for="nomecliente" class="col-sm-8 col-form-label">
                Identificação do Cliente (digite o numero do cliente)</label>
            <div class="col-sm-10"><br></br>
                <h:inputText  id="nomecliente" value="#{notaFiscalBean.idCliente}" type="number" class="form-control"  a:autofocus="true" />
            </div>
        </div>

        <div class="form-group row">
            <label for="nomecliente" class="col-sm-8 col-form-label">
                Numero da Nota Fiscal ou Cupom</label>
            <div class="col-sm-10"><br></br>
                <h:inputText  id="numeronota" value="#{notaFiscalBean.notaFiscal.numero}"  type="number" class="form-control" />
            </div>
        </div>

        <div class="form-group row">
            <label for="datanota" class="col-sm-8 col-form-label">
                Data da Nota</label>
            <div class="col-sm-10"><br></br>
                <h:inputText class="date" value="#{notaFiscalBean.notaFiscal.data.time}" id="datanota" >
                <f:convertDateTime pattern="dd/MM/yyyy"
timeZone="America/Sao_Paulo" />
                </h:inputText>

            </div>
        </div>

        <div class="form-group row">
            <label for="valornota" class="col-sm-8 col-form-label">
                Valor da Nota</label>
            <div class="col-sm-10"><br></br>
                <h:inputText  id="valornota" value="#{notaFiscalBean.notaFiscal.valor}" type="number" class="form-control"/>
            </div>
        </div>


        <h:commandButton value="Cadastrar" type="submit" class="btn btn-warning" action="#{notaFiscalBean.gravar}"></h:commandButton>

notaFiscalBean

@Model
public class NotaFiscalBean{

    private Cliente cliente = new Cliente();
    private NotaFiscal notaFiscal = new NotaFiscal();
    private Long idCliente;

    @Transactional
    public void gravar() {

        Cliente cliente = clienteDAO.buscaPorId(idCliente);

        clienteDAO.save(cliente);

        notaFiscalDAO.adiciona(notaFiscal);

        this.notaFiscal = new NotaFiscal();

        this.cliente = new Cliente();

        idCliente = null;
    }

notaFiscalDAO

public class NotaFiscalDAO implements Serializable {

    private static final long serialVersionUID = 1L;


    @PersistenceContext
    private EntityManager manager;

    public void adiciona(NotaFiscal nota) {
        manager.persist(nota);
    }


notafiscal

@Entity
public class NotaFiscal implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    private String numero;
    private Double valor;
    @Temporal(TemporalType.DATE)
    private Calendar data = Calendar.getInstance();


    @OneToMany(cascade=CascadeType.PERSIST, mappedBy="notaFiscal")
    private List<Cliente> clientes;

}

cliente

@Entity
 public class Cliente {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;        
    private String nome;    
    private String sobrenome;
    @Email
    @NotBlank
    @Column(unique=true)
    private String email;
    private String senha;    
    private String cpf;    
    private String cep;    
    private String endereco;    
    private String numero;    
    private String bairro;    
    private String cidade;    
    private String estado;
    private String ddd;    
    private String celular;

clienteDAO

public Cliente buscaPorId(Long id) {

        Cliente cliente = manager.find(Cliente.class, id);

        return cliente;
    }
3 respostas

Oi Sérgio, tudo bem?

Você vai precisar atribuir o cliente à nota fiscal:

        Cliente cliente = clienteDAO.buscaPorId(idCliente);
        notaFiscal.setCliente(cliente );
        notaFiscalDAO.adiciona(notaFiscal);

além disso, faz sentido NotaFiscal ter uma lista de clientes? Imagino que o relacionamento seja o contrário, o Cliente pode ter uma lista de NotaFiscal, correto?

Abraço!

Oi Otávio, muito obrigado pelo retorno. Isso mesmo, eu pensei em o cliente ter várias notas fiscais atribuídas a ele e nunca uma nota fiscal emitida para vários clientes. Sendo assim, está correto eu indicar @OneToMany na nota fiscal? No Cliente eu deveria indicar:?

 @OneToMany
    private NotaFiscal notaFiscal;

Fiz o teste com a alteração que me propôs e está cadastrando a NF corretamente mas não mostra o numero do cliente que esta nota fiscal está vinculada, no BD aparece o id, numero da nf, data e valor mas não aparece o numero do cliente a quem ela pertence.

No cadastro do cliente aparece o campo numero da nota fiscal e o valor é null. Seguem os arquivos com as alterações:

nota fiscal:

@Entity
public class NotaFiscal implements Serializable{

    private static final long serialVersionUID = 1L;

     @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Long id;
        private String numero;
        private Double valor;
        @Temporal(TemporalType.DATE)
        private Calendar data = Calendar.getInstance();


        @OneToMany(cascade=CascadeType.PERSIST, mappedBy="notaFiscal")
        private List<Cliente> clientes;



    public NotaFiscal() {

    }

cliente

@Entity
 public class Cliente {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;        
    private String nome;    
    private String sobrenome;
    @Email
    @NotBlank
    @Column(unique=true)
    private String email;
    private String senha;    
    private String cpf;    
    private String cep;    
    private String endereco;    
    private String numero;    
    private String bairro;    
    private String cidade;    
    private String estado;
    private String ddd;    
    private String celular;


    private NotaFiscal notaFiscal;


    public Cliente() {
    }

notaFiscalBean

@Model
public class NotaFiscalBean {


    private NotaFiscal notaFiscal = new NotaFiscal();
    @Inject
    private NotaFiscalDAO notaFiscalDAO;
    @Inject
    private ClienteDAO clienteDAO;

    private Cliente cliente = new Cliente();
    private Long idCliente;




    @Transactional
    public void gravar() {

         Cliente cliente = clienteDAO.buscaPorId(idCliente);
         notaFiscal.setCliente(cliente );
         notaFiscalDAO.adiciona(notaFiscal);

        clienteDAO.save(cliente);

        this.notaFiscal = new NotaFiscal();

        this.setCliente(new Cliente());

        idCliente = null;
    }
solução!

Pessoal para quem precisar da solução:

no arquivo notaFiscal altere para:

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

        public NotaFiscal() {

        }

e inclua os getters e setters do cliente (por isso estava preenchendo o BD com NULL)

no arquivo Cliente altere para:

@OneToMany(mappedBy="cliente")
    private Set<NotaFiscal> notas;

//no final do arquivo
public Set<NotaFiscal> getNotas() {
        return notas;
    }

    public void setNotas(Set<NotaFiscal> notas) {
        this.notas = notas;
    }