consulta sobre persistencia y singleton

Hola buenos dias. Soy novato en cuanto a java (soy analista de sistemas y simpre he visto pascal, visual fox, visual basic; he leido sobre POO, etc y he estado siguiendo tutoriales y videotutoriales y demas con netbeans 6 y 7).

Mi consulta viene a que estoy empezando hacer una aplicacion de escritorio (la tipica clientes, proveedores, stock algo sencillo para empezar) persistencia con eclipselink
Tengo la persistecia.xml y creo la clase Clientes (desde Nuevo---Persistencia---entity classes from database) y el clientesJpaController
(desde Nuevo---Persistencia---jpa controller classes from entity classes) pero mi consulta es que dentro del JDialog (formulario cliente) leyendo bastante por ahi, que no es bueno crear el
factory=Persistence.createEntityManagerFactory("pruebaPU");
porque crearia varios factory cada vez que abre el jdialog (la cual el create,edit etc del ClientesJpaController al llamarlo desde el JDialog funciona bien)
y si es necesario implentar singleton (patrón o anti-patrón según opiniones) para que cree una sola vez esta clase y pueda usarse en toda la aplicación o como es la correcta forma de hacerlo y trabajar bien con persistencia; algún ejemplo de como podria ser me vendria bien.

Disculpen si escribi demasiado es para explicar bien mi problema...
Espero que alguien me pueda ayudar ya que me intereza mucho avanzar e ir aprendiedo java.
Saludos

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de neko069

Ejemplo

Tal vez si pusieras un ejemplo con código, sería mucho más digerible (entre tags de <code> y </code> por favor).

consulta sobre persistencia y singleton

Hola.
De ante mano gracias por contestar y por tus molestias
Te comento el codigo de la clase "clientes" y el "clientesJpaController" es el generico que me crea el mismo netbeans con el asistente como decia anteriormente (agregar------nuevo-----persistencia-----etc) sin modificar nada; para informarte la base es en mysql se llama prueba; la tabla se llama clientes y solo tiene unos campos de prueba como CodigoCliente (integer de longitud 4 y es clave primaria), ApellidoyNombre, Direccion, Ciudad, y Telefono (todos estos son varchar de longitug 20)
Obviamente aca no existe nada de MVC porque es solamente de prueba con persistencia para luego empezar a trabajar correctamente con MVC
y aca te muestro parte del codigo de el jdialog
Saludos

package factusis;

import factusis.exceptions.PreexistingEntityException;
import java.beans.Beans;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.RollbackException;
import javax.swing.JOptionPane;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author fede
 */

public class GestionClientes extends javax.swing.JDialog {

        private EntityManagerFactory factory;

        private ClientesJpaController daoProgram;
    /**
     * Creates new form GestionClientes
     */

    public GestionClientes(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        this.setLocationRelativeTo(null);
            if (!Beans.isDesignTime()) {
            entityManager.getTransaction().begin();
        }
            factory = Persistence.createEntityManagerFactory("pruebaPU");  //------>esto es lo que comentan que esta mal cargado aqui en los foros
            daoProgram = new ClientesJpaController(factory);
            list = daoProgram.findClientesEntities();
         
    }
   @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {
// ----------------------------con toda la declaraciones------------------------------
        bindingGroup.bind();
        pack();
    }// </editor-fold>

private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {                                          
        try {

            factusis.Clientes c = new factusis.Clientes();      
            c.setCodigoCliente(Integer.parseInt (this.TxtCodigoCliente.getText()));
            c.setApellidoyNombre(this.TxtApellidoyNombre.getText());
            c.setCuidad(this.TxtCiudad.getText());
            c.setDireccion(this.TxtDireccion.getText());
            c.setTelefono(this.TxtTelefono.getText());
            daoProgram.create(c);

        } catch (PreexistingEntityException ex) {
            Logger.getLogger(GestionClientes.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(GestionClientes.class.getName()).log(Level.SEVERE, null, ex);
        }
    }    
............
...............
.....................
}

consulta sobre persistencia y singleton

Alguien que me pueda dar una mano o una idea...
Gracias y saludos

sobre jpa

te recomiendo uses una sola intancia del entity manager y lo hagas accecible para todo tu programa. No tengo mucha experiencia en aplicaciones de escritorio, pero en web los entity manager pueden ser inyectados en direfentes contextos.
Otra variante seria desplegar tu logica de negocio en un servidor de aplicaciones y hagas acceso a los componentes remotamente (claro que esto depende del contexto y ambito de tu app)
saludos

Imagen de CuicaJavier

De esta forma trabajo yo con Netbeans Platform

public class Installer extends ModuleInstall {

   public static EntityManagerFactory EMF;
   public static EntityManager        EM;

   @Override
   public void close() {
      EM.close();
      EMF.close();
   }

   @Override
   public void restored() {

      try {
         EMF = Persistence.createEntityManagerFactory("Cap29JavaLibraryPU");
         EM = EMF.createEntityManager();
      } catch (Throwable ex) {
         System.err.println("Initial EntityManagerFactory creation failed." + ex);
         throw new ExceptionInInitializerError(ex);
      }

      EM.getTransaction().begin();
      EM.merge(new Genre(1, "Techno, Trance & Dance"));
      EM.merge(new Genre(2, "Rock & Pop"));
      EM.merge(new Genre(3, "Country & Classic"));
      EM.getTransaction().commit();
   }
}

Imagen de CuicaJavier

Estos son sus metodos

package com.galileo.netbeans.module;

import com.galileo.netbeans.myentities.Genre;
import com.galileo.netbeans.myentities.Album;
import java.util.List;
import javax.persistence.Query;

public class DataModel {

   @SuppressWarnings("unchecked")
   public static List<Album> getAlbums() {
      Installer.EM.getTransaction().begin();
      Query q = Installer.EM.createQuery("SELECT a FROM Album a");
      List<Album> list = q.getResultList();
      Installer.EM.getTransaction().commit();

      return list;
   }

   @SuppressWarnings("unchecked")
   public static List<Genre> getGenres() {
      Installer.EM.getTransaction().begin();
      Query q = Installer.EM.createQuery("SELECT g FROM Genre g");
      List<Genre> list = q.getResultList();
      Installer.EM.getTransaction().commit();

      return list;
   }

   public static void updateAlbum(Album album) {
      Installer.EM.getTransaction().begin();
      Installer.EM.persist(album);
      Installer.EM.getTransaction().commit();
   }

   public static void insertAlbum(Album album) {
      updateAlbum(album);

   }

   public static void deleteAlbum(Album album) {
      Installer.EM.getTransaction().begin();
      Installer.EM.remove(album);
      Installer.EM.getTransaction().commit();
   }
   
}

Imagen de neko069

Observaciones

Empecemos por el EntityManagerFactory, éste debería de ser un singleton, ¿porqué? bueno, según la documentación de JPA(que la verdad me da flojera buscar el apartado) el EntityManagerFactory es un objeto que consume muchos recursos al momento de crearlo, porque su construcción conlleva también la construcción de caché, pool de objetos EntityManager y otras cosas que no recuerdo bien... el punto es que debería haber sólo un objeto de EntityManagerFactory en la aplicación.

En cambio, el EntityManagerFactory gestiona a los EntityManager, los cuales ya puedes crear/cerrar al momento que los uses, puedes crear un DAO padre genérico el cual obtenga una referencia estática a tu Singleton, o igual en tu singleton tener un método que obtenga un objeto EntityManager, y ya sólo te preocupas por jalarlo en tus métodos.

Por último, ya tus clases que sean front-end sólo te preocupas por usar los métodos que declares en tus DAOs.

Ejemplo erizo, úsalo sólo de guía, SOLO DE GUIA.

//producer
public class EntityManagerFactoryProducer{

    private EntityManagerFactoryProducer instance;    

    private EntityManagerFactoryProducer(){/* para el singleton*/}
   
    public EntityManagerFactoryProducer getInstance(){
       //aqui lleva el codigo para que recuperes una instancia de esta clase y ya
    }
}

// template con los metodos de los daos
public interface TemplateDao<T, PK extends Serializable> {

    PK insert(T instance);
    T select(PK id);
    PK update(T instance);
    void delete(T instance);
}
//implementacion padre, puede ser abstracta. O NO
public class DadDaoImpl <T, PK extends Serializable>   implements TemplateDao<T, PK> {

   PK insert(T instance){
        this.getEntityManager().persist(instance);
        return instance.getId();
    }

    T select(Class class, PK id) {
        return (T)em.find(class, custID);
    }

    PK update(T instance) {
        this.getEntityManager().refresh(instance);
        return instance.getId();
    }

    void delete(T instance) {
        this.getEntityManager().delete(instance);
    }

  private void getEntityManager(){
      return EntityManagerFactoryProducer.getInstance().createEntityManager();
  }
}

Obviamente el código que te digo tiene N+1 fallas, huecos, cosas que puedes/deberías mejorar antes de usarlo, peeeeeero ilustra el punto que te digo, el EntityManagerFactory debe ser un singleton, y ya de ahí ése objeto se encarga de proporcionar los EntityManager que sean necesarios para que tus métodos funcionen, ya de ahí podrías usar ésos DAOs en algunas clases de servicio (capa de control) y que ésos servicios sean los que usan tus clases de front-end.

Frameworks como seam-persistence, o el módulo spring JPA template te podrían ayudar a simplificar el uso del EntityManagerFactory si es que puedes usar frameworks; o ya de menos alguna biblioteca para usar aspectos, podrían hacer menos doloroso el implementar éste tipo de cosas.

Espero no haber contribuido a hacer más grandes tus dudas.

consulta sobre persistencia y singleton

Hola como andas? gracias por constestar. Te comento que aun no tengo conocimientos aplicando esa tecnica. Por lo que lei qué seria con EJB? disculpa si dije una tontera aun no estoy familiariazado con java y netbeans.
Gracias nuevamente por tus molestias
Saludos

consulta sobre persistencia y singleton

Hola como andas? gracias por constestar CuicaJavier.
Vos en tu caso que estas declarando en un principio del sistema por unica vez y de forma publica al EntityManager y al EntityManagerFactory y de esta forma lo accedes desde todo el sistema, o estoy errandole???
Gracias nuevamente por tus molestias
Saludos

Imagen de CuicaJavier

Estas en lo cierto

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.ecygnus.module.Almacen;

import java.util.List;
import javax.persistence.Query;
import libraries.modules.MaCodAlm;

/**
 *
 * @author richard
 */

public class DataModel {
   
    @SuppressWarnings("unchecked")
    public static List<MaCodAlm> getAlmacen(){
        Installer.EM.getTransaction().begin();
        Query q = Installer.EM.createQuery("SELECT m FROM MaCodAlm m");
        List<MaCodAlm> list = q.getResultList();
        Installer.EM.getTransaction().commit();
       
        return list;
    }
   
    public static void updateAlmacen(MaCodAlm maCodAlm){
        Installer.EM.getTransaction().begin();
        Installer.EM.persist(maCodAlm);
        Installer.EM.getTransaction().commit();
    }
   
    public static void insertAlmacen(MaCodAlm maCodAlm){
        updateAlmacen(maCodAlm);
    }
   
    public static void deleteAlmacen(MaCodAlm maCodAlm){
        Installer.EM.getTransaction().begin();
        Installer.EM.remove(maCodAlm);
        Installer.EM.getTransaction().commit();
    }
   
}
---------------------------------------------------------------------------
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.ecygnus.module.Almacen;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.openide.modules.ModuleInstall;

public class Installer extends ModuleInstall {

    public static EntityManagerFactory EMF;
    public static EntityManager EM;
   
    @Override
    public void close(){
        EM.close();
        EMF.close();
    }
   
    @Override
    public void restored() {
        try {
            EMF = Persistence.createEntityManagerFactory("dbcyg01LibraryPU"); //dbcyg01LibraryPU es la persistencia
            EM = EMF.createEntityManager();
        } catch (Throwable ex) {
            System.err.println("Conexion a EntityManagerFactory fallida" + ex);
            throw  new ExceptionInInitializerError(ex);
        }
    }
}
---------------------------------------------------------------------------------------------

Imagen de CuicaJavier

Mi WindowComponent o en todo caso Jframe

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.ecygnus.module.Almacen;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;
import javax.swing.text.Document;
import libraries.modules.MaCodAlm;
import org.netbeans.api.settings.ConvertAsProperties;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.windows.TopComponent;
import org.openide.util.NbBundle.Messages;

/**
 * Top component which displays something.
 */

@ConvertAsProperties(
    dtd = "-//com.ecygnus.module.Almacen//CodAlmacen//EN",
autostore = false)
@TopComponent.Description(
    preferredID = "CodAlmacenTopComponent",
//iconBase="SET/PATH/TO/ICON/HERE",
persistenceType = TopComponent.PERSISTENCE_ALWAYS)
@TopComponent.Registration(mode = "explorer", openAtStartup = true)
@ActionID(category = "Window", id = "com.ecygnus.module.Almacen.CodAlmacenTopComponent")
@ActionReference(path = "Menu/Window" /*, position = 333 */)
@TopComponent.OpenActionRegistration(
    displayName = "#CTL_CodAlmacenAction",
preferredID = "CodAlmacenTopComponent")
@Messages({
    "CTL_CodAlmacenAction=CodAlmacen",
    "CTL_CodAlmacenTopComponent=CodAlmacen Window",
    "HINT_CodAlmacenTopComponent=This is a CodAlmacen window"
})
public final class CodAlmacenTopComponent extends TopComponent {

    private AlmacenTableModel model = new AlmacenTableModel();
   
    public CodAlmacenTopComponent() {
        initComponents();
        setName(Bundle.CTL_CodAlmacenTopComponent());
        setToolTipText(Bundle.HINT_CodAlmacenTopComponent());
       
               
        //Mensaje del Label
        lblMensaje.setVisible(false);
       
        tblAlmacen.setModel(model);
        tblAlmacen.addKeyListener(new KeyAdapter() {
       
            @Override
            public void keyPressed(KeyEvent event){
                if(event.getKeyCode() == KeyEvent.VK_ENTER){
                    verAlamacenActionPerformed(null);
                }
                if(event.getKeyCode()==KeyEvent.VK_F2){
                    btnIngresarActionPerformed(null);
                }
                if(event.getKeyCode()==KeyEvent.VK_F3){
                    btnModificarActionPerformed(null);
                }
               
            }
        });

    }
   
    private void verAlamacenActionPerformed(java.awt.event.ActionEvent evt){
        if(tblAlmacen.getSelectedRowCount()>0){
            MaCodAlm maCodAlm = AlmacenVentanaDialog.verAlmacen(model.getRow(tblAlmacen.getSelectedRow()));
            if(maCodAlm != null){
                DataModel.updateAlmacen(maCodAlm);
                model.fireTableDataChanged();
            }
            tblAlmacen.requestFocus();
        }
    }

    /**
     * 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.
     */

    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel2 = new javax.swing.JPanel();
        jLabel11 = new javax.swing.JLabel();
        jLabel12 = new javax.swing.JLabel();
        lblMensaje = new javax.swing.JLabel();
        jPanel1 = new javax.swing.JPanel();
        btnAyudar = new javax.swing.JButton();
        btnIngresar = new javax.swing.JButton();
        btnModificar = new javax.swing.JButton();
        btnListar = new javax.swing.JButton();
        btnEliminar = new javax.swing.JButton();
        btnConsultar = new javax.swing.JButton();
        btnFin = new javax.swing.JButton();
        txtBusqueda = new javax.swing.JTextField();
        scrollPanel = new javax.swing.JScrollPane();
        tblAlmacen = new javax.swing.JTable();

        jPanel2.setBackground(new java.awt.Color(0, 102, 204));

        jLabel11.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jLabel11.setForeground(new java.awt.Color(255, 255, 255));
        org.openide.awt.Mnemonics.setLocalizedText(jLabel11, org.openide.util.NbBundle.getMessage(CodAlmacenTopComponent.class, "CodAlmacenTopComponent.jLabel11.text")); // NOI18N

        jLabel12.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jLabel12.setForeground(new java.awt.Color(255, 255, 255));
        org.openide.awt.Mnemonics.setLocalizedText(jLabel12, org.openide.util.NbBundle.getMessage(CodAlmacenTopComponent.class, "CodAlmacenTopComponent.jLabel12.text")); // NOI18N

        lblMensaje.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        lblMensaje.setForeground(new java.awt.Color(255, 255, 255));
        org.openide.awt.Mnemonics.setLocalizedText(lblMensaje, org.openide.util.NbBundle.getMessage(CodAlmacenTopComponent.class, "CodAlmacenTopComponent.lblMensaje.text")); // NOI18N
        lblMensaje.setEnabled(false);

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel11)
                .addGap(69, 69, 69)
                .addComponent(jLabel12, javax.swing.GroupLayout.PREFERRED_SIZE, 217, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(92, 92, 92)
                .addComponent(lblMensaje, javax.swing.GroupLayout.PREFERRED_SIZE, 142, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jLabel11, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jLabel12, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(lblMensaje))
        );

        jPanel1.setBackground(new java.awt.Color(0, 102, 204));

        org.openide.awt.Mnemonics.setLocalizedText(btnAyudar, org.openide.util.NbBundle.getMessage(CodAlmacenTopComponent.class, "CodAlmacenTopComponent.btnAyudar.text")); // NOI18N
        btnAyudar.setActionCommand(org.openide.util.NbBundle.getMessage(CodAlmacenTopComponent.class, "CodAlmacenTopComponent.btnAyudar.actionCommand")); // NOI18N
        btnAyudar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAyudarActionPerformed(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(btnIngresar, org.openide.util.NbBundle.getMessage(CodAlmacenTopComponent.class, "CodAlmacenTopComponent.btnIngresar.text")); // NOI18N
        btnIngresar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnIngresarActionPerformed(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(btnModificar, org.openide.util.NbBundle.getMessage(CodAlmacenTopComponent.class, "CodAlmacenTopComponent.btnModificar.text")); // NOI18N
        btnModificar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnModificarActionPerformed(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(btnListar, org.openide.util.NbBundle.getMessage(CodAlmacenTopComponent.class, "CodAlmacenTopComponent.btnListar.text")); // NOI18N
        btnListar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnListarActionPerformed(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(btnEliminar, org.openide.util.NbBundle.getMessage(CodAlmacenTopComponent.class, "CodAlmacenTopComponent.btnEliminar.text")); // NOI18N
        btnEliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEliminarActionPerformed(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(btnConsultar, org.openide.util.NbBundle.getMessage(CodAlmacenTopComponent.class, "CodAlmacenTopComponent.btnConsultar.text")); // NOI18N
        btnConsultar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnConsultarActionPerformed(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(btnFin, org.openide.util.NbBundle.getMessage(CodAlmacenTopComponent.class, "CodAlmacenTopComponent.btnFin.text")); // NOI18N
        btnFin.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnFinActionPerformed(evt);
            }
        });

        txtBusqueda.setText(org.openide.util.NbBundle.getMessage(CodAlmacenTopComponent.class, "CodAlmacenTopComponent.txtBusqueda.text")); // NOI18N

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(btnAyudar, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(36, 36, 36)
                        .addComponent(btnIngresar, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(37, 37, 37)
                        .addComponent(btnModificar, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(35, 35, 35)
                        .addComponent(btnListar, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(btnConsultar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(txtBusqueda, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(242, 242, 242)))
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(btnEliminar, javax.swing.GroupLayout.PREFERRED_SIZE, 109, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnFin))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(btnListar)
                        .addComponent(btnModificar)
                        .addComponent(btnIngresar)
                        .addComponent(btnEliminar))
                    .addComponent(btnAyudar))
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(btnConsultar)
                    .addComponent(btnFin)
                    .addComponent(txtBusqueda, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(17, Short.MAX_VALUE))
        );

        tblAlmacen.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        scrollPanel.setViewportView(tblAlmacen);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(scrollPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 624, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(scrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
    }// </editor-fold>                        

    private void btnAyudarActionPerformed(java.awt.event.ActionEvent evt) {                                          

    }                                        

    private void btnIngresarActionPerformed(java.awt.event.ActionEvent evt) {                                            
        MaCodAlm maCodAlm = AlmacenVentanaDialog.newAlmacen();
        try {
            if(maCodAlm != null){
                DataModel.insertAlmacen(maCodAlm);
                model.getData().add(maCodAlm);
                model.fireTableDataChanged();
            }
        } catch (Exception e) {
            lblMensaje.setVisible(true);
            lblMensaje.setEnabled(true);
        }
       
        //Devolvemos el foco a la tabla
        tblAlmacen.requestFocus();
        //Para indicar la ultima tabla ingresada
        tblAlmacen.changeSelection(tblAlmacen.getRowCount()-1, 0, false, false);
    }                                          

    private void btnModificarActionPerformed(java.awt.event.ActionEvent evt) {                                            
        if(tblAlmacen.getSelectedRowCount() > 0){
            try {
                MaCodAlm maCodAlm = AlmacenVentanaDialog.editAlmacen(model.getRow(tblAlmacen.getSelectedRow()));
                if(maCodAlm != null){
                    DataModel.updateAlmacen(maCodAlm);
                    model.fireTableDataChanged();
                } else {
                    JOptionPane.showMessageDialog(null, "Error");
                }
               
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Error al modificar");
            }
        }
        tblAlmacen.requestFocus();
    }                                            

    private void btnListarActionPerformed(java.awt.event.ActionEvent evt) {                                          

    }                                        

    private void btnEliminarActionPerformed(java.awt.event.ActionEvent evt) {                                            
            try {
                if(tblAlmacen.getSelectedRow() > 0){
                    MaCodAlm maCodAlm = model.getRow(tblAlmacen.getSelectedRow());
                    DataModel.deleteAlmacen(maCodAlm);
                    model.getData().remove(maCodAlm);
                    model.fireTableDataChanged();
                }
                System.out.println("Modificacion satisfactoria");
        } catch (Exception e) {
        }
        tblAlmacen.requestFocus();
    }                                          

    private void btnConsultarActionPerformed(java.awt.event.ActionEvent evt) {                                            

    }                                            

    private void btnFinActionPerformed(java.awt.event.ActionEvent evt) {                                      
        System.exit(0);

    }                                      

    // Variables declaration - do not modify                    
    private javax.swing.JButton btnAyudar;
    private javax.swing.JButton btnConsultar;
    private javax.swing.JButton btnEliminar;
    private javax.swing.JButton btnFin;
    private javax.swing.JButton btnIngresar;
    private javax.swing.JButton btnListar;
    private javax.swing.JButton btnModificar;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel12;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JLabel lblMensaje;
    private javax.swing.JScrollPane scrollPanel;
    private javax.swing.JTable tblAlmacen;
    private javax.swing.JTextField txtBusqueda;
    // End of variables declaration                  
    @Override
    public void componentOpened() {
        model.getData().clear();
        model.getData().addAll(DataModel.getAlmacen());
        model.fireTableDataChanged();
    }

    @Override
    public void componentClosed() {
        // TODO add custom code on component closing
    }

    void writeProperties(java.util.Properties p) {
        // better to version settings since initial version as advocated at
        // <a href="http://wiki.apidesign.org/wiki/PropertyFiles
" title="http://wiki.apidesign.org/wiki/PropertyFiles
">http://wiki.apidesign.org/wiki/PropertyFiles
</a>        p.setProperty("
version", "1.0");
        // TODO store your settings
    }

    void readProperties(java.util.Properties p) {
        String version = p.getProperty("version");
        // TODO read your settings according to their version
    }
   
    private static final class AlmacenTableModel extends AbstractTableModel{

        private String[] columns = {"Cc","Descripción","Desc. Abrev","SGR","SNI","SVS","SNT","Sc"};
        private List<MaCodAlm> data = new ArrayList<MaCodAlm>();
       
        public MaCodAlm getRow(int row){
            return data.get(row);
        }
       
        @Override
        public int getRowCount() {
            return data.size();
        }

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

        @Override
        public String getColumnName(int col){
            return columns[col];
        }
       
        @Override
        public Object getValueAt(int row, int col) {
            MaCodAlm maCodAlm = data.get(row);
           
            switch(col){
                case 0: return maCodAlm.getCodAlma();
                case 1: return maCodAlm.getDesAlma();
                case 2: return maCodAlm.getAbvAlma();
                case 3: return maCodAlm.getSecAlma();
                case 4: return maCodAlm.getNsgrAlma();
                case 5: return maCodAlm.getNsniAlma();
                case 6: return maCodAlm.getNsvsAlma();
                case 7: return maCodAlm.getNsntAlma();
                case 8: return maCodAlm.getStAlma();
            }
            return "";
        }
        public List<MaCodAlm> getData(){
            return data;
        }
       
    }
}

consulta sobre persistencia y singleton

Gracias por responder tan rapido CuicaJavier.
Voy a empezar seguramente a trbajarlo de esta manera definiendolo en un principio y publico y tratare de ir viendo y aprendiendo a aplicar correctamente singleton para luego ver si lo puedo adaptar.
Desde ya muchas gracias, ya que he buscado por muchos lados y no se ve ejemplos especificos entre jpa y aplicaciones de escritorio, y fue el unico lugar donde me han respondido.
Nuevamente gracias y saludos

consulta sobre persistencia y singleton

Hola neko069 como andas? gracias por responder, te comento que por lo que he visto mi idea es poder hacerlo con un singleton, seguramente arranque trabajando declarandolo al inicio del sistema como unico y publico.. pero la idea es buscar aprender a aplicar bien el singleton y acoplar el sistema de esta forma correctamente
Desde ya muchas gracias, ya que he buscado por muchos lados y no se ve ejemplos especificos entre jpa y aplicaciones de escritorio, y fue el unico lugar donde me han respondido.
Nuevamente gracias y
Saludos

Imagen de neko069

Entonces, sí nos vamos

Entonces, sí nos vamos entendiendo.
No es necesario que arranques el singleton al inicio del sistema, cuando se necesite que entre en acción, se creará una vez, las veces subsecuentes, se reutilizará el mismo objeto (en teoría así funciona el singleton).
Con los ejemplos que ya tienes, puedes iniciar a armar un prototipo. Suerte!

Gracias

Gracias nueamente a los tres por molestarse en responder; no se si es necesario ponerle algo a la consulta como que me han respondido o como trabaja este sitio en si.
A travez de sus consejos seguire profundizando sobre el tema y tratar de hacer este programita para ir tomando ideas...

Saludos

Imagen de CuicaJavier

Estamos para ayudarnos

En la noche te paso los libros que tengo :)

Buenisimo

Hola como andas?

Te comento yo he leido "Piensa en Java" de Bruce Eckel la segunda edición (baje en estos dias varios más en la cual esta la cuarta y teno que mirarlo), "Aprenda java como si estuviera en primero" deTecnum, "Java 2 Curso de Programación" de Javier Ceballos, "Programacion Orientada Objeto PHP5" de Enrique Place,"Scrum Manager-En busca de la excelencia del Código" de Raúl Herranz
Varios manuales y tutoriales como "Manual Avanzado de JPA" de Carmelo Navarro Serna,
Videotutoriales como el de Jesús Conde "Curso de Java para Principiantes (40 videos)" y mirando el de JavaEE (también de él) y mirando muchos videos de youtube y leyendo muchos foros también

Aunque hay dos libros que me gustaria conseguir que escuche que es son muy buenos uno es el "Libro Desktop Java Live by Scott Delap" lo tengo pero esta en ingles y no se tanto como leer un libro completo en inglés y no lo puedo traducir ya que es un pdf pero de imagen y el otro que me gustaria "Introduction to Programming Using Java by David J. Eck" (este podria traducirlo pero el google no lo hace), no se si vos los has leido estos o tenes algo parecido
Obviamente lo que se repetia de libro en libro lo fui saltando y muchas cosas ya las tenia vista de antes.

....Hace rato que quiero empezar de a realizar programas con java aunque cuando estudie analista en sistema me hicieron odiar la programación ya que vimos todo pascal pero de tal forma que al final.... yo se que muchas cosas que vi es aplicable a todos los lenguajes pero te digo que fue tan tedioso que no quise saber más nada, luego de mucho tiempo perdido con cual es el lenguaje mas adecuado, con otros lenguajes y demas, hasta que di con java aunque fue muy dificil al principio entender a netbeans por si sólo (ya que vivo en un pueblo y por estos lados no hay profesores que te expliquen java, ni que decir del tiempo xq tengo dos trabajos y bue) con netbeans y de apoco voy agarrando viaje...

Pero si vos tenes algún libro o manual que me ayude a cuanto realizar una correcta técnica de diseño y programación con java y netbeans para hacer un sistema más efictivo y eficiente te lo agradeceria, por eso busco esos dos libros escuche que podria servir para esto. O si me recomendas un traductor pdf que no sea el de google ya que no me lo traduce.

Bueno dejo de escribir ya que seguro se aburrieron..jaja

Saludos