<repo_name>maurolopez/Catalogo<file_sep>/src/catalogo/vistas/VendedorUI.java
package catalogo.vistas;

import catalogo.Catalogo;
import catalogo.controladores.JPA.OrdenDeCompraJpaController;
import catalogo.controladores.JPA.VendedorJpaController;
import catalogo.modelo.Vendedor;
import java.awt.BorderLayout;
import javax.swing.JComponent;
import javax.swing.JOptionPane;

/**
 *
 * @author <NAME>
 */
public class VendedorUI extends javax.swing.JFrame {

    private OrdenDeCompraJpaController ordenDeCompraJpaController;
    private VendedorJpaController vendedorJpaController;

    /**
     * Creates new form VendedorUI
     */
    public VendedorUI() {
        initComponents();
        vendedorJpaController = Catalogo.getVendedorJpaController();
        agregarComponenteAlCentro(panelIniciarSesion);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        panelIniciarSesion = new javax.swing.JPanel();
        etiquetaNombreDeUsuario = new javax.swing.JLabel();
        campoNombreDeUsuario = new javax.swing.JTextField();
        etiquetaContraseña = new javax.swing.JLabel();
        campoContraseña = new javax.swing.JPasswordField();
        botonIniciarSesion = new javax.swing.JButton();
        barraMenu = new javax.swing.JMenuBar();
        menuOperaciones = new javax.swing.JMenu();
        itemMenuCatalogo = new javax.swing.JMenuItem();
        itemMenuOrdenDeCompraActual = new javax.swing.JMenuItem();
        itemMenuOrdenesPendientes = new javax.swing.JMenuItem();
        itemMenuHistorialOrdenCompra = new javax.swing.JMenuItem();
        itemMenuMisDatos = new javax.swing.JMenuItem();
        itemMenuCerrarSesion = new javax.swing.JMenuItem();

        panelIniciarSesion.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Iniciar Sesión", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 20))); // NOI18N
        panelIniciarSesion.setMaximumSize(new java.awt.Dimension(700, 500));
        panelIniciarSesion.setMinimumSize(new java.awt.Dimension(700, 500));
        panelIniciarSesion.setPreferredSize(new java.awt.Dimension(700, 500));

        etiquetaNombreDeUsuario.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N
        etiquetaNombreDeUsuario.setText("Nombre de usuario");

        campoNombreDeUsuario.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N

        etiquetaContraseña.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N
        etiquetaContraseña.setText("Contraseña");

        campoContraseña.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N

        botonIniciarSesion.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N
        botonIniciarSesion.setText("Iniciar Sesión");
        botonIniciarSesion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonIniciarSesionActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelIniciarSesionLayout = new javax.swing.GroupLayout(panelIniciarSesion);
        panelIniciarSesion.setLayout(panelIniciarSesionLayout);
        panelIniciarSesionLayout.setHorizontalGroup(
            panelIniciarSesionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelIniciarSesionLayout.createSequentialGroup()
                .addGap(153, 153, 153)
                .addGroup(panelIniciarSesionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(etiquetaContraseña, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(etiquetaNombreDeUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, 142, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelIniciarSesionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(campoNombreDeUsuario)
                    .addComponent(campoContraseña)
                    .addComponent(botonIniciarSesion, javax.swing.GroupLayout.PREFERRED_SIZE, 241, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(148, Short.MAX_VALUE))
        );
        panelIniciarSesionLayout.setVerticalGroup(
            panelIniciarSesionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelIniciarSesionLayout.createSequentialGroup()
                .addGap(46, 46, 46)
                .addGroup(panelIniciarSesionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(etiquetaNombreDeUsuario)
                    .addComponent(campoNombreDeUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(6, 6, 6)
                .addGroup(panelIniciarSesionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(etiquetaContraseña)
                    .addComponent(campoContraseña, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(botonIniciarSesion)
                .addContainerGap(327, Short.MAX_VALUE))
        );

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Vendedor");
        setLocationByPlatform(true);
        setMinimumSize(new java.awt.Dimension(700, 500));

        menuOperaciones.setMnemonic('e');
        menuOperaciones.setText("Operaciones");
        menuOperaciones.setEnabled(false);

        itemMenuCatalogo.setMnemonic('t');
        itemMenuCatalogo.setText("Ver catálogo");
        itemMenuCatalogo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemMenuCatalogoActionPerformed(evt);
            }
        });
        menuOperaciones.add(itemMenuCatalogo);

        itemMenuOrdenDeCompraActual.setText("Órden de compra actual");
        itemMenuOrdenDeCompraActual.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemMenuOrdenDeCompraActualActionPerformed(evt);
            }
        });
        menuOperaciones.add(itemMenuOrdenDeCompraActual);

        itemMenuOrdenesPendientes.setMnemonic('y');
        itemMenuOrdenesPendientes.setText("Órdenes de compra pendientes");
        itemMenuOrdenesPendientes.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemMenuOrdenesPendientesActionPerformed(evt);
            }
        });
        menuOperaciones.add(itemMenuOrdenesPendientes);

        itemMenuHistorialOrdenCompra.setText("Historial de órdenes de compra");
        itemMenuHistorialOrdenCompra.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemMenuHistorialOrdenCompraActionPerformed(evt);
            }
        });
        menuOperaciones.add(itemMenuHistorialOrdenCompra);

        itemMenuMisDatos.setMnemonic('d');
        itemMenuMisDatos.setText("Mis datos");
        itemMenuMisDatos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemMenuMisDatosActionPerformed(evt);
            }
        });
        menuOperaciones.add(itemMenuMisDatos);

        itemMenuCerrarSesion.setText("Cerrar sesión");
        itemMenuCerrarSesion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemMenuCerrarSesionActionPerformed(evt);
            }
        });
        menuOperaciones.add(itemMenuCerrarSesion);

        barraMenu.add(menuOperaciones);

        setJMenuBar(barraMenu);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void itemMenuCatalogoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_itemMenuCatalogoActionPerformed
        agregarComponenteAlCentro(new CatalogoUI(ordenDeCompraJpaController));
    }//GEN-LAST:event_itemMenuCatalogoActionPerformed

    private void itemMenuOrdenesPendientesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_itemMenuOrdenesPendientesActionPerformed
        agregarComponenteAlCentro(new OrdenesDeCompraPendientesUI(ordenDeCompraJpaController));
    }//GEN-LAST:event_itemMenuOrdenesPendientesActionPerformed

    private void itemMenuMisDatosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_itemMenuMisDatosActionPerformed
        MisDatosUI misDatosUI = new MisDatosUI();
        agregarComponenteAlCentro(misDatosUI);
        Vendedor cliente = ordenDeCompraJpaController.getVendedor();
        misDatosUI.setVendedor(cliente);
    }//GEN-LAST:event_itemMenuMisDatosActionPerformed

    private void itemMenuOrdenDeCompraActualActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_itemMenuOrdenDeCompraActualActionPerformed
        agregarComponenteAlCentro(new OrdenDeCompraActualUI(ordenDeCompraJpaController));
    }//GEN-LAST:event_itemMenuOrdenDeCompraActualActionPerformed

    private void botonIniciarSesionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonIniciarSesionActionPerformed
        try {
            String username = campoNombreDeUsuario.getText();
            String password = <PASSWORD>.getText();
            Vendedor vendedor = vendedorJpaController.iniciarSesion(username, password);
            ordenDeCompraJpaController = new OrdenDeCompraJpaController(vendedor);
            campoNombreDeUsuario.setText("");
            campoContraseña.setText("");
            limpiarCentro();
            menuOperaciones.setEnabled(true);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_botonIniciarSesionActionPerformed

    private void itemMenuCerrarSesionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_itemMenuCerrarSesionActionPerformed
        ordenDeCompraJpaController = null;
        menuOperaciones.setEnabled(false);
        agregarComponenteAlCentro(panelIniciarSesion);
    }//GEN-LAST:event_itemMenuCerrarSesionActionPerformed

    private void itemMenuHistorialOrdenCompraActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_itemMenuHistorialOrdenCompraActionPerformed
        agregarComponenteAlCentro(new HistorialOrdenesDeCompraUI(ordenDeCompraJpaController));
    }//GEN-LAST:event_itemMenuHistorialOrdenCompraActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(VendedorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(VendedorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(VendedorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(VendedorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new VendedorUI().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenuBar barraMenu;
    private javax.swing.JButton botonIniciarSesion;
    private javax.swing.JPasswordField campoContraseña;
    private javax.swing.JTextField campoNombreDeUsuario;
    private javax.swing.JLabel etiquetaContraseña;
    private javax.swing.JLabel etiquetaNombreDeUsuario;
    private javax.swing.JMenuItem itemMenuCatalogo;
    private javax.swing.JMenuItem itemMenuCerrarSesion;
    private javax.swing.JMenuItem itemMenuHistorialOrdenCompra;
    private javax.swing.JMenuItem itemMenuMisDatos;
    private javax.swing.JMenuItem itemMenuOrdenDeCompraActual;
    private javax.swing.JMenuItem itemMenuOrdenesPendientes;
    public static javax.swing.JMenu menuOperaciones;
    private javax.swing.JPanel panelIniciarSesion;
    // End of variables declaration//GEN-END:variables

    private void agregarComponenteAlCentro(JComponent componente) {
        limpiarCentro();
        add(componente, BorderLayout.CENTER);
        componente.setVisible(true);
        componente.updateUI();
        pack();
    }

    private void limpiarCentro() {
        getContentPane().removeAll();
        getContentPane().repaint();
    }

}
<file_sep>/src/catalogo/modelo/ProductoOrdenCompra.java
package catalogo.modelo;

import java.io.Serializable;
import javax.persistence.*;

/**
 *
 * @author <NAME>
 */
@Entity
public class ProductoOrdenCompra implements Serializable {
    private static long serialVersionUID = 1L;

    /**
     * @return the serialVersionUID
     */
    public static long getSerialVersionUID() {
        return serialVersionUID;
    }

    /**
     * @param aSerialVersionUID the serialVersionUID to set
     */
    public static void setSerialVersionUID(long aSerialVersionUID) {
        serialVersionUID = aSerialVersionUID;
    }
    @Id
    @Column(name = "idProductoOrdenCompra")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @ManyToOne
    private Producto producto;
    @ManyToOne
    private OrdenCompra OrdenCompra;
    private Long cantidad;

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (getId() != null ? getId().hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof ProductoOrdenCompra)) {
            return false;
        }
        ProductoOrdenCompra other = (ProductoOrdenCompra) object;
        if ((this.getId() == null && other.getId() != null) || (this.getId() != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "catalogo.modelo.ProductoOrdenCompra[ id=" + getId() + " ]";
    }

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

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

    /**
     * @return the producto
     */
    public Producto getProducto() {
        return producto;
    }

    /**
     * @param producto the producto to set
     */
    public void setProducto(Producto producto) {
        this.producto = producto;
    }

    /**
     * @return the OrdenCompra
     */
    public OrdenCompra getOrdenCompra() {
        return OrdenCompra;
    }

    /**
     * @param OrdenCompra the OrdenCompra to set
     */
    public void setOrdenCompra(OrdenCompra OrdenCompra) {
        this.OrdenCompra = OrdenCompra;
    }

    /**
     * @return the cantidad
     */
    public Long getCantidad() {
        return cantidad;
    }

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

    public Double getMontoTotal() {
        return producto.getPrecio() * cantidad;
    }

}
<file_sep>/src/catalogo/vistas/AdministrarVendedoresUI.java
package catalogo.vistas;

import catalogo.Catalogo;
import catalogo.controladores.JPA.VendedorJpaController;
import catalogo.modelo.Vendedor;
import catalogo.vistas.modelo.VendedorTableModel;
import javax.swing.JOptionPane;

/**
 *
 * @author <NAME>
 */
public class AdministrarVendedoresUI extends javax.swing.JPanel {

    private VendedorJpaController vendedorJpaController;
    private VendedorTableModel vendedorTableModel;

    /**
     * Creates new form AdministrarVendedoresUI
     */
    public AdministrarVendedoresUI() {
        initComponents();
        vendedorJpaController = Catalogo.getVendedorJpaController();
        vendedorTableModel = new VendedorTableModel();
        tablaVendedores.setModel(vendedorTableModel);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        nuevoVendedorUI = new javax.swing.JDialog();
        etiquetaApellido = new javax.swing.JLabel();
        campoApellido = new javax.swing.JTextField();
        etiquetaNombre = new javax.swing.JLabel();
        campoNombre = new javax.swing.JTextField();
        etiquetaCorreo = new javax.swing.JLabel();
        campoCorreo = new javax.swing.JTextField();
        etiquetaTelefono = new javax.swing.JLabel();
        campoTelefono = new javax.swing.JFormattedTextField();
        etiquetaUsername = new javax.swing.JLabel();
        campoUsername = new javax.swing.JTextField();
        etiquetaPassword = new javax.swing.JLabel();
        campoPassword = new javax.swing.JPasswordField();
        botonGuardarCliente = new javax.swing.JButton();
        jsp = new javax.swing.JScrollPane();
        tablaVendedores = new javax.swing.JTable();
        panelBotones = new javax.swing.JPanel();
        botonNuevoVendedor = new javax.swing.JButton();
        botonEliminarVendedor = new javax.swing.JButton();

        nuevoVendedorUI.setTitle("Nuevo cliente");
        nuevoVendedorUI.setMinimumSize(new java.awt.Dimension(257, 201));

        etiquetaApellido.setText("Apellido");

        etiquetaNombre.setText("Nombre");

        etiquetaCorreo.setText("Correo");

        etiquetaTelefono.setText("Teléfono");

        campoTelefono.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("##########"))));

        etiquetaUsername.setText("Nombre de usuario");

        etiquetaPassword.setText("<PASSWORD>");

        botonGuardarCliente.setText("Guardar");
        botonGuardarCliente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonGuardarClienteActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout nuevoVendedorUILayout = new javax.swing.GroupLayout(nuevoVendedorUI.getContentPane());
        nuevoVendedorUI.getContentPane().setLayout(nuevoVendedorUILayout);
        nuevoVendedorUILayout.setHorizontalGroup(
            nuevoVendedorUILayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(nuevoVendedorUILayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(nuevoVendedorUILayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(etiquetaUsername, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(etiquetaPassword, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(etiquetaTelefono, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(etiquetaCorreo, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(etiquetaNombre, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(etiquetaApellido, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(nuevoVendedorUILayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(botonGuardarCliente)
                    .addGroup(nuevoVendedorUILayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(campoApellido)
                        .addComponent(campoNombre)
                        .addComponent(campoCorreo)
                        .addComponent(campoUsername)
                        .addComponent(campoTelefono)
                        .addComponent(campoPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 143, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        nuevoVendedorUILayout.setVerticalGroup(
            nuevoVendedorUILayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(nuevoVendedorUILayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(nuevoVendedorUILayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(campoApellido, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(etiquetaApellido))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(nuevoVendedorUILayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(etiquetaNombre)
                    .addComponent(campoNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(nuevoVendedorUILayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(campoCorreo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(etiquetaCorreo))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(nuevoVendedorUILayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(campoTelefono, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(etiquetaTelefono))
                .addGap(6, 6, 6)
                .addGroup(nuevoVendedorUILayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(campoUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(etiquetaUsername))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(nuevoVendedorUILayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(campoPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(etiquetaPassword))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(botonGuardarCliente)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Vendedores", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 20))); // NOI18N
        setMaximumSize(new java.awt.Dimension(700, 500));
        setMinimumSize(new java.awt.Dimension(700, 500));
        setPreferredSize(new java.awt.Dimension(700, 500));
        setLayout(new java.awt.BorderLayout());

        tablaVendedores.setModel(new catalogo.vistas.modelo.VendedorTableModel());
        tablaVendedores.getTableHeader().setReorderingAllowed(false);
        jsp.setViewportView(tablaVendedores);

        add(jsp, java.awt.BorderLayout.CENTER);

        panelBotones.setMaximumSize(new java.awt.Dimension(32767, 23));
        panelBotones.setMinimumSize(new java.awt.Dimension(100, 23));

        botonNuevoVendedor.setText("Nuevo Vendedor");
        botonNuevoVendedor.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonNuevoVendedorActionPerformed(evt);
            }
        });
        panelBotones.add(botonNuevoVendedor);

        botonEliminarVendedor.setText("Eliminar Vendedor");
        botonEliminarVendedor.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonEliminarVendedorActionPerformed(evt);
            }
        });
        panelBotones.add(botonEliminarVendedor);

        add(panelBotones, java.awt.BorderLayout.PAGE_END);
    }// </editor-fold>//GEN-END:initComponents

    private void botonNuevoVendedorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonNuevoVendedorActionPerformed
        campoApellido.setText("");
        campoNombre.setText("");
        campoCorreo.setText("");
        campoTelefono.setValue(null);
        campoUsername.setText("");
        campoPassword.setText("");
        nuevoVendedorUI.setVisible(true);
        nuevoVendedorUI.pack();
    }//GEN-LAST:event_botonNuevoVendedorActionPerformed

    private void botonGuardarClienteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonGuardarClienteActionPerformed
        try {
            String apellido = campoApellido.getText();
            String nombre = campoNombre.getText();
            String correo = campoCorreo.getText();
            Long telefono = ((Number) campoTelefono.getValue()).longValue();
            String username = campoUsername.getText();
            String password = campoPassword.getText();
            vendedorJpaController.registrarNuevoVendedor(apellido, nombre, correo, telefono, username, password);
            nuevoVendedorUI.setVisible(false);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_botonGuardarClienteActionPerformed

    private void botonEliminarVendedorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonEliminarVendedorActionPerformed
        try {
            Integer filaSeleccionada = tablaVendedores.getSelectedRow();
            if (filaSeleccionada >= 0) {
                Vendedor vendedor = vendedorTableModel.obtenerCliente(filaSeleccionada);
                vendedorJpaController.destruirVendedor(vendedor.getId());
            } else {
                throw new Exception("No ha seleccionado ningún vendedor.");
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        } finally {
            tablaVendedores.clearSelection();
        }
    }//GEN-LAST:event_botonEliminarVendedorActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botonEliminarVendedor;
    private javax.swing.JButton botonGuardarCliente;
    private javax.swing.JButton botonNuevoVendedor;
    private javax.swing.JTextField campoApellido;
    private javax.swing.JTextField campoCorreo;
    private javax.swing.JTextField campoNombre;
    private javax.swing.JPasswordField campoPassword;
    private javax.swing.JFormattedTextField campoTelefono;
    private javax.swing.JTextField campoUsername;
    private javax.swing.JLabel etiquetaApellido;
    private javax.swing.JLabel etiquetaCorreo;
    private javax.swing.JLabel etiquetaNombre;
    private javax.swing.JLabel etiquetaPassword;
    private javax.swing.JLabel etiquetaTelefono;
    private javax.swing.JLabel etiquetaUsername;
    private javax.swing.JScrollPane jsp;
    private javax.swing.JDialog nuevoVendedorUI;
    private javax.swing.JPanel panelBotones;
    private javax.swing.JTable tablaVendedores;
    // End of variables declaration//GEN-END:variables
}
<file_sep>/src/catalogo/vistas/OrdenesDeCompraPendientesUI.java
package catalogo.vistas;

import catalogo.controladores.JPA.OrdenDeCompraJpaController;
import catalogo.modelo.OrdenCompra;
import catalogo.modelo.ProductoOrdenCompra;
import catalogo.vistas.modelo.OrdenesPendientesListModel;
import catalogo.vistas.modelo.ProductoOrdenDeCompraTableModel;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 *
 * @author <NAME>
 */
public class OrdenesDeCompraPendientesUI extends javax.swing.JPanel {

    private OrdenDeCompraJpaController ordenDeCompraJpaController;
    private OrdenesPendientesListModel ordenesPendientesListModel;
    private ProductoOrdenDeCompraTableModel productoOrdenDeCompraTableModel;
    private OrdenCompra ordenDeCompra = null;

    /**
     * Creates new form OrdenesDeCompraPendientesUI
     */
    public OrdenesDeCompraPendientesUI() {
        initComponents();
    }

    public OrdenesDeCompraPendientesUI(OrdenDeCompraJpaController ordenDeCompraJpaController) {
        this();
        this.ordenDeCompraJpaController = ordenDeCompraJpaController;
        ordenesPendientesListModel = new OrdenesPendientesListModel(ordenDeCompraJpaController);
        listaOrdenesPendientes.setModel(ordenesPendientesListModel);
        productoOrdenDeCompraTableModel = new ProductoOrdenDeCompraTableModel();
        tablaProductosDeOrdenDeCompra.setModel(productoOrdenDeCompraTableModel);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        codigoEnvioUI = new javax.swing.JDialog();
        campoCodigoEnvio = new javax.swing.JFormattedTextField();
        etiquetaCodigoEnvio = new javax.swing.JLabel();
        botonGuardarCodigoEnvio = new javax.swing.JButton();
        panelOrdenesPendientes = new javax.swing.JPanel();
        botonFinalizarEnvio = new javax.swing.JButton();
        jspLista = new javax.swing.JScrollPane();
        listaOrdenesPendientes = new javax.swing.JList();
        panelProductosOrdenes = new javax.swing.JPanel();
        campoFecha = new javax.swing.JLabel();
        jspTablaProductos = new javax.swing.JScrollPane();
        tablaProductosDeOrdenDeCompra = new javax.swing.JTable();
        campoMontoTotal = new javax.swing.JLabel();

        codigoEnvioUI.setTitle("Finalizar envío");
        codigoEnvioUI.setLocationByPlatform(true);
        codigoEnvioUI.setResizable(false);

        campoCodigoEnvio.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("############"))));

        etiquetaCodigoEnvio.setText("Ingrese el código de envío");

        botonGuardarCodigoEnvio.setText("Guardar");
        botonGuardarCodigoEnvio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonGuardarCodigoEnvioActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout codigoEnvioUILayout = new javax.swing.GroupLayout(codigoEnvioUI.getContentPane());
        codigoEnvioUI.getContentPane().setLayout(codigoEnvioUILayout);
        codigoEnvioUILayout.setHorizontalGroup(
            codigoEnvioUILayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(codigoEnvioUILayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(etiquetaCodigoEnvio)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(codigoEnvioUILayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(botonGuardarCodigoEnvio)
                    .addComponent(campoCodigoEnvio, javax.swing.GroupLayout.PREFERRED_SIZE, 139, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        codigoEnvioUILayout.setVerticalGroup(
            codigoEnvioUILayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(codigoEnvioUILayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(codigoEnvioUILayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(campoCodigoEnvio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(etiquetaCodigoEnvio))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(botonGuardarCodigoEnvio)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Órdenes de compra pendientes", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 20))); // NOI18N
        setMaximumSize(new java.awt.Dimension(700, 500));
        setMinimumSize(new java.awt.Dimension(700, 500));
        setPreferredSize(new java.awt.Dimension(700, 500));
        setLayout(new java.awt.BorderLayout());

        panelOrdenesPendientes.setLayout(new java.awt.BorderLayout());

        botonFinalizarEnvio.setText("Finalizar Envío");
        botonFinalizarEnvio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonFinalizarEnvioActionPerformed(evt);
            }
        });
        panelOrdenesPendientes.add(botonFinalizarEnvio, java.awt.BorderLayout.PAGE_END);

        jspLista.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N
        jspLista.setMaximumSize(new java.awt.Dimension(150, 32767));
        jspLista.setMinimumSize(new java.awt.Dimension(150, 23));
        jspLista.setPreferredSize(new java.awt.Dimension(150, 130));

        listaOrdenesPendientes.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        listaOrdenesPendientes.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                listaOrdenesPendientesMouseClicked(evt);
            }
        });
        jspLista.setViewportView(listaOrdenesPendientes);

        panelOrdenesPendientes.add(jspLista, java.awt.BorderLayout.CENTER);

        add(panelOrdenesPendientes, java.awt.BorderLayout.LINE_START);

        panelProductosOrdenes.setLayout(new java.awt.BorderLayout());

        campoFecha.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        campoFecha.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        campoFecha.setText("Fecha de la órden de compra");
        panelProductosOrdenes.add(campoFecha, java.awt.BorderLayout.PAGE_START);

        jspTablaProductos.setMaximumSize(new java.awt.Dimension(32767, 350));
        jspTablaProductos.setMinimumSize(new java.awt.Dimension(23, 350));
        jspTablaProductos.setPreferredSize(new java.awt.Dimension(452, 350));

        tablaProductosDeOrdenDeCompra.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null}
            },
            new String [] {
                "Título 1", "Título 2", "Título 3", "Título 4", "Título 5"
            }
        ));
        jspTablaProductos.setViewportView(tablaProductosDeOrdenDeCompra);

        panelProductosOrdenes.add(jspTablaProductos, java.awt.BorderLayout.CENTER);

        campoMontoTotal.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        campoMontoTotal.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
        campoMontoTotal.setText("Monto total de la órden de compra");
        panelProductosOrdenes.add(campoMontoTotal, java.awt.BorderLayout.PAGE_END);

        add(panelProductosOrdenes, java.awt.BorderLayout.CENTER);
    }// </editor-fold>//GEN-END:initComponents

    private void botonFinalizarEnvioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonFinalizarEnvioActionPerformed
        try {
            if(ordenDeCompra != null) {
                campoCodigoEnvio.setValue(null);
                codigoEnvioUI.setVisible(true);
                codigoEnvioUI.pack();
            } else {
                throw new Exception("No ha seleccionado ningún órden de compra pendiente");
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_botonFinalizarEnvioActionPerformed

    private void listaOrdenesPendientesMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_listaOrdenesPendientesMouseClicked
        int indiceSeleccionado = listaOrdenesPendientes.getSelectedIndex();
        System.out.println(indiceSeleccionado);
        if(indiceSeleccionado >= 0) {
            ordenDeCompra = (OrdenCompra) ordenesPendientesListModel.getElementAt(indiceSeleccionado);
            ArrayList<ProductoOrdenCompra> productosDeOrdenCompra = ordenDeCompra.getProductosDeOrdenCompra();
            productoOrdenDeCompraTableModel.setProductosOrdenDeCompra(productosDeOrdenCompra);
        }
        listaOrdenesPendientes.clearSelection();
    }//GEN-LAST:event_listaOrdenesPendientesMouseClicked

    private void botonGuardarCodigoEnvioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonGuardarCodigoEnvioActionPerformed
        try {
            Long codigoEnvio = ((Number) campoCodigoEnvio.getValue()).longValue();
            ordenDeCompraJpaController.finalizarEnvio(ordenDeCompra, codigoEnvio);
            ordenDeCompra = null;
            codigoEnvioUI.setVisible(false);
            productoOrdenDeCompraTableModel.setProductosOrdenDeCompra(new ArrayList());
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_botonGuardarCodigoEnvioActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botonFinalizarEnvio;
    private javax.swing.JButton botonGuardarCodigoEnvio;
    private javax.swing.JFormattedTextField campoCodigoEnvio;
    private javax.swing.JLabel campoFecha;
    private javax.swing.JLabel campoMontoTotal;
    private javax.swing.JDialog codigoEnvioUI;
    private javax.swing.JLabel etiquetaCodigoEnvio;
    private javax.swing.JScrollPane jspLista;
    private javax.swing.JScrollPane jspTablaProductos;
    private javax.swing.JList listaOrdenesPendientes;
    private javax.swing.JPanel panelOrdenesPendientes;
    private javax.swing.JPanel panelProductosOrdenes;
    private javax.swing.JTable tablaProductosDeOrdenDeCompra;
    // End of variables declaration//GEN-END:variables
}
<file_sep>/src/catalogo/modelo/OrdenCompra.java
package catalogo.modelo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.*;

/**
 *
 * @author <NAME>
 */
@Entity
public class OrdenCompra implements Serializable {

    private static long serialVersionUID = 1L;

    /**
     * @return the serialVersionUID
     */
    public static long getSerialVersionUID() {
        return serialVersionUID;
    }

    /**
     * @param aSerialVersionUID the serialVersionUID to set
     */
    public static void setSerialVersionUID(long aSerialVersionUID) {
        serialVersionUID = aSerialVersionUID;
    }
    @Id
    @Column(name = "idOrdenCompra")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private Long codigoEnvio;
    @Temporal(TemporalType.DATE)
    private Date fecha;
    private Boolean enviado;
    @ManyToOne
    private Vendedor vendedor;
    @OneToMany(mappedBy = "OrdenCompra")
    private List<ProductoOrdenCompra> productosDeOrdenCompra = new ArrayList();

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (getId() != null ? getId().hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof OrdenCompra)) {
            return false;
        }
        OrdenCompra other = (OrdenCompra) object;
        if ((this.getId() == null && other.getId() != null) || (this.getId() != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return fecha.toLocaleString();
    }

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

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

    /**
     * @return the codigoEnvio
     */
    public Long getCodigoEnvio() {
        return codigoEnvio;
    }

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

    /**
     * @return the fecha
     */
    public Date getFecha() {
        return fecha;
    }

    /**
     * @param fecha the fecha to set
     */
    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    /**
     * @return the enviado
     */
    public Boolean getEnviado() {
        return enviado;
    }

    /**
     * @param enviado the enviado to set
     */
    public void setEnviado(Boolean enviado) {
        this.enviado = enviado;
    }

    /**
     * @return the vendedor
     */
    public Vendedor getVendedor() {
        return vendedor;
    }

    /**
     * @param vendedor the vendedor to set
     */
    public void setVendedor(Vendedor vendedor) {
        this.vendedor = vendedor;
    }

    /**
     * @return the productosDeOrdenCompra
     */
    public ArrayList<ProductoOrdenCompra> getProductosDeOrdenCompra() {
        ArrayList<ProductoOrdenCompra> productos = new ArrayList();
        Object[] array = productosDeOrdenCompra.toArray();
        for(Object o : array)
            productos.add((ProductoOrdenCompra) o);
        return productos;
    }

    /**
     * @param productosDeOrdenCompra the productosDeOrdenCompra to set
     */
    public void setProductosDeOrdenCompra(List<ProductoOrdenCompra> productosDeOrdenCompra) {
        this.productosDeOrdenCompra = productosDeOrdenCompra;
    }

}
<file_sep>/src/catalogo/controladores/JPA/VendedorJpaController.java
package catalogo.controladores.JPA;

import catalogo.Catalogo;
import catalogo.controladores.JPA.exceptions.NonexistentEntityException;
import catalogo.modelo.OrdenCompra;
import catalogo.modelo.Vendedor;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import javax.persistence.*;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

/**
 *
 * @author <NAME>
 */
public class VendedorJpaController extends Observable implements Serializable {

    public VendedorJpaController() {
        this.emf = Catalogo.getEmf();
    }
    private EntityManagerFactory emf = null;

    private EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void crearVendedor(Vendedor vendedor) {
        if (vendedor.getOrdenes() == null) {
            vendedor.setOrdenes(new ArrayList<OrdenCompra>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            List<OrdenCompra> attachedOrdenes = new ArrayList<OrdenCompra>();
            for (OrdenCompra ordenesOrdenCompraToAttach : vendedor.getOrdenes()) {
                ordenesOrdenCompraToAttach = em.getReference(ordenesOrdenCompraToAttach.getClass(), ordenesOrdenCompraToAttach.getId());
                attachedOrdenes.add(ordenesOrdenCompraToAttach);
            }
            vendedor.setOrdenes(attachedOrdenes);
            em.persist(vendedor);
            for (OrdenCompra ordenesOrdenCompra : vendedor.getOrdenes()) {
                Vendedor oldVendedorOfOrdenesOrdenCompra = ordenesOrdenCompra.getVendedor();
                ordenesOrdenCompra.setVendedor(vendedor);
                ordenesOrdenCompra = em.merge(ordenesOrdenCompra);
                if (oldVendedorOfOrdenesOrdenCompra != null) {
                    oldVendedorOfOrdenesOrdenCompra.getOrdenes().remove(ordenesOrdenCompra);
                    oldVendedorOfOrdenesOrdenCompra = em.merge(oldVendedorOfOrdenesOrdenCompra);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
            notificarCambios();
        }
    }

    public void editarVendedor(Vendedor vendedor) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Vendedor persistentVendedor = em.find(Vendedor.class, vendedor.getId());
            List<OrdenCompra> ordenesOld = persistentVendedor.getOrdenes();
            List<OrdenCompra> ordenesNew = vendedor.getOrdenes();
            List<OrdenCompra> attachedOrdenesNew = new ArrayList<OrdenCompra>();
            for (OrdenCompra ordenesNewOrdenCompraToAttach : ordenesNew) {
                ordenesNewOrdenCompraToAttach = em.getReference(ordenesNewOrdenCompraToAttach.getClass(), ordenesNewOrdenCompraToAttach.getId());
                attachedOrdenesNew.add(ordenesNewOrdenCompraToAttach);
            }
            ordenesNew = attachedOrdenesNew;
            vendedor.setOrdenes(ordenesNew);
            vendedor = em.merge(vendedor);
            for (OrdenCompra ordenesOldOrdenCompra : ordenesOld) {
                if (!ordenesNew.contains(ordenesOldOrdenCompra)) {
                    ordenesOldOrdenCompra.setVendedor(null);
                    ordenesOldOrdenCompra = em.merge(ordenesOldOrdenCompra);
                }
            }
            for (OrdenCompra ordenesNewOrdenCompra : ordenesNew) {
                if (!ordenesOld.contains(ordenesNewOrdenCompra)) {
                    Vendedor oldVendedorOfOrdenesNewOrdenCompra = ordenesNewOrdenCompra.getVendedor();
                    ordenesNewOrdenCompra.setVendedor(vendedor);
                    ordenesNewOrdenCompra = em.merge(ordenesNewOrdenCompra);
                    if (oldVendedorOfOrdenesNewOrdenCompra != null && !oldVendedorOfOrdenesNewOrdenCompra.equals(vendedor)) {
                        oldVendedorOfOrdenesNewOrdenCompra.getOrdenes().remove(ordenesNewOrdenCompra);
                        oldVendedorOfOrdenesNewOrdenCompra = em.merge(oldVendedorOfOrdenesNewOrdenCompra);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Long id = vendedor.getId();
                if (findVendedor(id) == null) {
                    throw new NonexistentEntityException("The cliente with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
            notificarCambios();
        }
    }

    public void destruirVendedor(Long id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Vendedor vendedor;
            try {
                vendedor = em.getReference(Vendedor.class, id);
                vendedor.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The cliente with id " + id + " no longer exists.", enfe);
            }
            List<OrdenCompra> ordenes = vendedor.getOrdenes();
            for (OrdenCompra ordenesOrdenCompra : ordenes) {
                ordenesOrdenCompra.setVendedor(null);
                ordenesOrdenCompra = em.merge(ordenesOrdenCompra);
            }
            em.remove(vendedor);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
            notificarCambios();
        }
    }

    private List<Vendedor> findVendedorEntities() {
        return findVendedorEntities(true, -1, -1);
    }

    private List<Vendedor> findVendedorEntities(int maxResults, int firstResult) {
        return findVendedorEntities(false, maxResults, firstResult);
    }

    private List<Vendedor> findVendedorEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Vendedor.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    private Vendedor findVendedor(Long id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Vendedor.class, id);
        } finally {
            em.close();
        }
    }

    private int getVendedorCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Vendedor> rt = cq.from(Vendedor.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

    public ArrayList<Vendedor> obtenerVendedores() {
        ArrayList<Vendedor> vendedor = new ArrayList();
        Object[] array = findVendedorEntities().toArray();
        for(Object o : array)
            vendedor.add((Vendedor) o);
        return vendedor;
    }

    public void registrarNuevoVendedor(String apellido, String nombre, String correo, Long telefono, String username, String password) throws Exception {
        if(usernameValido(username)) {
            Vendedor nuevoVendedor = new Vendedor();
            nuevoVendedor.setApellido(apellido);
            nuevoVendedor.setNombre(nombre);
            nuevoVendedor.setCorreo(correo);
            nuevoVendedor.setTelefono(telefono);
            nuevoVendedor.setUsername(username);
            nuevoVendedor.setPassword(<PASSWORD>);
            crearVendedor(nuevoVendedor);
        } else {
            throw new Exception("El nombre de usuario ya está registrado.");
        }
    }

    private Boolean usernameValido(String username) {
        EntityManager em = getEntityManager();
        try {
            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<Vendedor> c = cb.createQuery(Vendedor.class);
            Root<Vendedor> p = c.from(Vendedor.class);
            c.select(p).where(cb.equal(p.get("username"), username.toUpperCase()));
            em.createQuery(c).getSingleResult();
            return false;
        } catch (NoResultException ex) {
            return true;
        } finally {
            em.close();
        }
    }

    private void notificarCambios() {
        setChanged();
        notifyObservers();
    }

    public Vendedor iniciarSesion(String username, String password) throws Exception {
        EntityManager em = getEntityManager();
        try {
            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<Vendedor> cq = cb.createQuery(Vendedor.class);
            Root<Vendedor> root = cq.from(Vendedor.class);
            cq.select(root);

            List<Predicate> predicateList = new ArrayList<Predicate>();

            Predicate usernamePredicate, passwordPredicate;

            if (username != null) {
                usernamePredicate = cb.equal(root.get("username"), username.toUpperCase());
                predicateList.add(usernamePredicate);
            }
            if (password != null) {
                passwordPredicate = cb.equal(root.get("password"), password.toUpperCase());
                predicateList.add(passwordPredicate);
            }
 
            Predicate[] predicates = new Predicate[predicateList.size()];
            predicateList.toArray(predicates);
            cq.where(predicates);
            return em.createQuery(cq).getSingleResult();
        } catch (NoResultException ex) {
            throw new Exception("No existe ningún vendedor con el nombre de usuario y contraseña indicados.");
        } finally {
            em.close();
        }
    }

}
<file_sep>/src/catalogo/vistas/CatalogoUI.java
package catalogo.vistas;

import catalogo.controladores.JPA.OrdenDeCompraJpaController;
import catalogo.modelo.Producto;
import catalogo.vistas.modelo.CatalogoListModel;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

/**
 *
 * @author <NAME>
 */
public class CatalogoUI extends javax.swing.JPanel {

    private CatalogoListModel catalogoListModel;
    private OrdenDeCompraJpaController ordenDeCompraJpaController;
    private Producto producto = null;

    /**
     * Creates new form CatalogoUI
     */
    public CatalogoUI() {
        initComponents();
    }

    public CatalogoUI(OrdenDeCompraJpaController ordenDeCompraJpaController) {
        this();
        this.ordenDeCompraJpaController = ordenDeCompraJpaController;
        catalogoListModel = new CatalogoListModel();
        lista.setModel(catalogoListModel);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        panel = new javax.swing.JPanel();
        etiquetaImagen = new javax.swing.JLabel();
        panelInformacion = new javax.swing.JPanel();
        etiquetaCodigo = new javax.swing.JLabel();
        jspAreaTexto = new javax.swing.JScrollPane();
        campoDescripcion = new javax.swing.JTextArea();
        etiquetaPrecio = new javax.swing.JLabel();
        etiquetaCantidad = new javax.swing.JLabel();
        campoCantidad = new javax.swing.JSpinner();
        botonAgregarProducto = new javax.swing.JButton();
        campoPrecio = new javax.swing.JFormattedTextField();
        campoCodigo = new javax.swing.JTextField();
        jspLista = new javax.swing.JScrollPane();
        lista = new javax.swing.JList();

        setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Catálogo", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 20))); // NOI18N
        setMaximumSize(new java.awt.Dimension(700, 500));
        setMinimumSize(new java.awt.Dimension(700, 500));
        setPreferredSize(new java.awt.Dimension(700, 500));
        setLayout(new java.awt.BorderLayout());

        panel.setLayout(new java.awt.BorderLayout());
        panel.add(etiquetaImagen, java.awt.BorderLayout.CENTER);

        panelInformacion.setMaximumSize(new java.awt.Dimension(488, 100));
        panelInformacion.setMinimumSize(new java.awt.Dimension(488, 100));

        etiquetaCodigo.setText("Código");

        campoDescripcion.setColumns(20);
        campoDescripcion.setEditable(false);
        campoDescripcion.setRows(5);
        jspAreaTexto.setViewportView(campoDescripcion);

        etiquetaPrecio.setText("Precio unitario");

        etiquetaCantidad.setText("CANTIDAD");

        campoCantidad.setModel(new javax.swing.SpinnerNumberModel(Long.valueOf(1L), Long.valueOf(1L), null, Long.valueOf(1L)));

        botonAgregarProducto.setText("Agregar Producto al Carrito");
        botonAgregarProducto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAgregarProductoActionPerformed(evt);
            }
        });

        campoPrecio.setEditable(false);
        campoPrecio.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("#,##0.00"))));

        campoCodigo.setEditable(false);

        javax.swing.GroupLayout panelInformacionLayout = new javax.swing.GroupLayout(panelInformacion);
        panelInformacion.setLayout(panelInformacionLayout);
        panelInformacionLayout.setHorizontalGroup(
            panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelInformacionLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jspAreaTexto)
                    .addGroup(panelInformacionLayout.createSequentialGroup()
                        .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(panelInformacionLayout.createSequentialGroup()
                                .addComponent(etiquetaCodigo, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(campoCodigo, javax.swing.GroupLayout.PREFERRED_SIZE, 163, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(etiquetaPrecio)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(campoPrecio, javax.swing.GroupLayout.PREFERRED_SIZE, 74, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(panelInformacionLayout.createSequentialGroup()
                                .addComponent(etiquetaCantidad, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(campoCantidad, javax.swing.GroupLayout.PREFERRED_SIZE, 52, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(botonAgregarProducto, javax.swing.GroupLayout.PREFERRED_SIZE, 228, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(0, 158, Short.MAX_VALUE)))
                .addContainerGap())
        );
        panelInformacionLayout.setVerticalGroup(
            panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelInformacionLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(etiquetaCodigo)
                    .addComponent(etiquetaPrecio)
                    .addComponent(campoPrecio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(campoCodigo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jspAreaTexto, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(etiquetaCantidad)
                    .addComponent(campoCantidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonAgregarProducto))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        panel.add(panelInformacion, java.awt.BorderLayout.PAGE_END);

        add(panel, java.awt.BorderLayout.CENTER);

        jspLista.setMaximumSize(new java.awt.Dimension(150, 32767));
        jspLista.setMinimumSize(new java.awt.Dimension(150, 23));
        jspLista.setPreferredSize(new java.awt.Dimension(150, 130));

        lista.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        lista.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                listaMouseClicked(evt);
            }
        });
        jspLista.setViewportView(lista);

        add(jspLista, java.awt.BorderLayout.LINE_START);
    }// </editor-fold>//GEN-END:initComponents

    private void listaMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_listaMouseClicked
        Integer indiceSeleccionado = lista.getSelectedIndex();
        if(indiceSeleccionado >= 0) {
            producto = (Producto) catalogoListModel.getElementAt(indiceSeleccionado);
            etiquetaImagen.setIcon(new ImageIcon(producto.getImagen()));
            campoCodigo.setText(producto.getCodigo());
            campoPrecio.setValue(producto.getPrecio());
            campoDescripcion.setText("Descripción: " + producto.getDescripcion());
        }
        lista.clearSelection();
    }//GEN-LAST:event_listaMouseClicked

    private void botonAgregarProductoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAgregarProductoActionPerformed
        try {
            if (producto != null) {
                Long cantidad = ((Number) campoCantidad.getValue()).longValue();
                ordenDeCompraJpaController.agregarProducto(producto, cantidad);
            } else {
                throw new Exception("No ha seleccionado ningún producto del catálogo.");
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_botonAgregarProductoActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botonAgregarProducto;
    private javax.swing.JSpinner campoCantidad;
    private javax.swing.JTextField campoCodigo;
    private javax.swing.JTextArea campoDescripcion;
    private javax.swing.JFormattedTextField campoPrecio;
    private javax.swing.JLabel etiquetaCantidad;
    private javax.swing.JLabel etiquetaCodigo;
    private javax.swing.JLabel etiquetaImagen;
    private javax.swing.JLabel etiquetaPrecio;
    private javax.swing.JScrollPane jspAreaTexto;
    private javax.swing.JScrollPane jspLista;
    private javax.swing.JList lista;
    private javax.swing.JPanel panel;
    private javax.swing.JPanel panelInformacion;
    // End of variables declaration//GEN-END:variables
}
<file_sep>/src/catalogo/vistas/modelo/OrdenesDeCompraTableModel.java
package catalogo.vistas.modelo;

import catalogo.controladores.JPA.OrdenDeCompraJpaController;
import catalogo.modelo.OrdenCompra;
import java.util.ArrayList;
import java.util.Date;
import java.util.Observable;
import java.util.Observer;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author <NAME>
 */
public class OrdenesDeCompraTableModel extends AbstractTableModel implements Observer {

    private String[] columnas = {"Fecha", "Código de envío", "enviado"};
    private ArrayList<OrdenCompra> ordenesDeCompra = new ArrayList();
    private OrdenDeCompraJpaController ordenDeCompraJpaController;

    public OrdenesDeCompraTableModel(OrdenDeCompraJpaController ordenDeCompraJpaController) {
        super();
        this.ordenDeCompraJpaController = ordenDeCompraJpaController;
        this.ordenDeCompraJpaController.addObserver(this);
        ordenesDeCompra = ordenDeCompraJpaController.obtenerTodasLasOrdenesDeCompra();
    }

    @Override
    public int getRowCount() {
        return ordenesDeCompra.size();
    }

    @Override
    public int getColumnCount() {
        return columnas.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        switch(columnIndex) {
            case 0 :
                return ordenesDeCompra.get(rowIndex).getFecha();
            case 1 :
                return ordenesDeCompra.get(rowIndex).getCodigoEnvio();
            case 2 :
                return ordenesDeCompra.get(rowIndex).getEnviado();
            default:
                return null;
        }
    }

    @Override
    public Class getColumnClass(int columnIndex) {
        switch(columnIndex) {
            case 0 :
                return Date.class;
            case 1 :
                return String.class;
            case 2 :
                return Boolean.class;
            default :
                return null;
        }
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    @Override
    public String getColumnName(int columnIndex) {
        return columnas[columnIndex];
    }

    @Override
    public void update(Observable o, Object arg) {
        ordenesDeCompra = ordenDeCompraJpaController.obtenerTodasLasOrdenesDeCompra();
        fireTableDataChanged();
    }

    public OrdenCompra obtenerOrdenDeCompra(int filaSeleccionada) {
        return this.ordenesDeCompra.get(filaSeleccionada);
    }

}
<file_sep>/src/catalogo/modelo/Vendedor.java
package catalogo.modelo;

import java.io.Serializable;
import java.util.List;
import javax.persistence.*;

/**
 *
 * @author <NAME>
 */
@Entity
public class Vendedor implements Serializable {

    private static long serialVersionUID = 1L;

    /**
     * @return the serialVersionUID
     */
    public static long getSerialVersionUID() {
        return serialVersionUID;
    }

    /**
     * @param aSerialVersionUID the serialVersionUID to set
     */
    public static void setSerialVersionUID(long aSerialVersionUID) {
        serialVersionUID = aSerialVersionUID;
    }
    @Id
    @Column(name = "idVendedor")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(length = 50, nullable = false)
    private String apellido;
    @Column(length = 50, nullable = false)
    private String nombre;
    @Column(length = 150)
    private String correo;
    private Long telefono;
    @Column(length = 100, nullable = false, unique = true)
    private String username;
    @Column(length = 100, nullable = false)
    private String password;
    @OneToMany(mappedBy = "vendedor")
    private List<OrdenCompra> ordenes;

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (getId() != null ? getId().hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Vendedor)) {
            return false;
        }
        Vendedor other = (Vendedor) object;
        if ((this.getId() == null && other.getId() != null) || (this.getId() != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return apellido + " " + nombre;
    }

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

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

    /**
     * @return the apellido
     */
    public String getApellido() {
        return apellido;
    }

    /**
     * @param apellido the apellido to set
     */
    public void setApellido(String apellido) {
        this.apellido = apellido.toUpperCase();
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre.toUpperCase();
    }

    /**
     * @return the correo
     */
    public String getCorreo() {
        return correo;
    }

    /**
     * @param correo the correo to set
     */
    public void setCorreo(String correo) {
        this.correo = correo;
    }

    /**
     * @return the telefono
     */
    public Long getTelefono() {
        return telefono;
    }

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

    /**
     * @return the username
     */
    public String getUsername() {
        return username;
    }

    /**
     * @param username the username to set
     */
    public void setUsername(String username) {
        this.username = username.toUpperCase();
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = <PASSWORD>;
    }

    /**
     * @return the ordenes
     */
    public List<OrdenCompra> getOrdenes() {
        return ordenes;
    }

    /**
     * @param ordenes the ordenes to set
     */
    public void setOrdenes(List<OrdenCompra> ordenes) {
        this.ordenes = ordenes;
    }

}
<file_sep>/src/catalogo/controladores/JPA/ProductoJpaController.java
package catalogo.controladores.JPA;

import catalogo.Catalogo;
import catalogo.controladores.JPA.exceptions.NonexistentEntityException;
import catalogo.modelo.Producto;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import javax.persistence.*;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

/**
 *
 * @author <NAME>
 */
public class ProductoJpaController extends Observable  implements Serializable {

    public ProductoJpaController() {
        this.emf = Catalogo.getEmf();
    }
    private EntityManagerFactory emf = null;

    private EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void crearProducto(Producto producto) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(producto);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
            notificarCambios();
        }
    }

    public void editarProducto(Producto producto) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            producto = em.merge(producto);
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Long id = producto.getId();
                if (findProducto(id) == null) {
                    throw new NonexistentEntityException("The producto with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
            notificarCambios();
        }
    }

    public void destruirProducto(Long id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Producto producto;
            try {
                producto = em.getReference(Producto.class, id);
                producto.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The producto with id " + id + " no longer exists.", enfe);
            }
            em.remove(producto);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
            notificarCambios();
        }
    }

    private List<Producto> findProductoEntities() {
        return findProductoEntities(true, -1, -1);
    }

    private List<Producto> findProductoEntities(int maxResults, int firstResult) {
        return findProductoEntities(false, maxResults, firstResult);
    }

    private List<Producto> findProductoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Producto.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    private Producto findProducto(Long id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Producto.class, id);
        } finally {
            em.close();
        }
    }

    private int getProductoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Producto> rt = cq.from(Producto.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

    public ArrayList<Producto> obtenerProductos() {
        ArrayList<Producto> productos = new ArrayList();
        Object[] array = findProductoEntities().toArray();
        for(Object p : array)
            productos.add((Producto) p);
        return productos;
    }

    private void notificarCambios() {
        setChanged();
        notifyObservers();
    }

    public void registrarNuevoProducto(String codigo, String nombre, String descripcion, Double precio, byte[] imagen) throws Exception {
        if(codigoValido(codigo)) {
            Producto producto = new Producto();
            producto.setCodigo(codigo);
            producto.setNombre(nombre);
            producto.setDescripcion(descripcion);
            producto.setPrecio(precio);
            producto.setImagen(imagen);
            crearProducto(producto);
        } else {
            throw new Exception("El código ya está registrado.");
        }
    }

    private Boolean codigoValido(String codigo) {
        EntityManager em = getEntityManager();
        try {
            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<Producto> c = cb.createQuery(Producto.class);
            Root<Producto> p = c.from(Producto.class);
            c.select(p).where(cb.equal(p.get("codigo"), codigo.toUpperCase()));
            em.createQuery(c).getSingleResult();
            return false;
        } catch (NoResultException ex) {
            return true;
        } finally {
            em.close();
        }
    }

}
<file_sep>/src/catalogo/vistas/modelo/CatalogoListModel.java
package catalogo.vistas.modelo;

import catalogo.Catalogo;
import catalogo.controladores.JPA.ProductoJpaController;
import catalogo.modelo.Producto;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
import javax.swing.AbstractListModel;

/**
 *
 * @author <NAME>
 */
public class CatalogoListModel extends AbstractListModel implements Observer {

    private ProductoJpaController productoJpaController;
    private ArrayList<Producto> productos;

    public CatalogoListModel() {
        super();
        productoJpaController = Catalogo.getProductoJpaController();
        productos = productoJpaController.obtenerProductos();
    }

    @Override
    public int getSize() {
        return productos.size();
    }

    @Override
    public Object getElementAt(int index) {
        return productos.get(index);
    }

    @Override
    public void update(Observable o, Object arg) {
        productos = productoJpaController.obtenerProductos();
        fireContentsChanged(this, 0, productos.size());
    }

}
<file_sep>/src/catalogo/Catalogo.java
package catalogo;

import catalogo.controladores.JPA.ProductoJpaController;
import catalogo.controladores.JPA.VendedorJpaController;
import catalogo.vistas.ProveedorUI;
import catalogo.vistas.VendedorUI;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author <NAME>
 */
public class Catalogo {

    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("CatalogoPU");
    private static VendedorJpaController vendedorJpaController = new VendedorJpaController();
    private static ProductoJpaController productoJpaController = new ProductoJpaController();

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        ProveedorUI proveedorUI = new ProveedorUI();
        proveedorUI.setVisible(true);
        proveedorUI.pack();
        VendedorUI vendedorUI = new VendedorUI();
        vendedorUI.setVisible(true);
        vendedorUI.pack();
    }

    /**
     * @return the emf
     */
    public static EntityManagerFactory getEmf() {
        return emf;
    }

    /**
     * @param aEmf the emf to set
     */
    public static void setEmf(EntityManagerFactory aEmf) {
        emf = aEmf;
    }

    /**
     * @return the vendedorJpaController
     */
    public static VendedorJpaController getVendedorJpaController() {
        return vendedorJpaController;
    }

    /**
     * @param aClienteJpaController the vendedorJpaController to set
     */
    public static void setVendedorJpaController(VendedorJpaController aClienteJpaController) {
        vendedorJpaController = aClienteJpaController;
    }

    /**
     * @return the productoJpaController
     */
    public static ProductoJpaController getProductoJpaController() {
        return productoJpaController;
    }

    /**
     * @param aProductosController the productoJpaController to set
     */
    public static void setProductosJpaController(ProductoJpaController aProductosController) {
        productoJpaController = aProductosController;
    }

}
