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
- Inicie sesión o regístrese para enviar comentarios
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
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
De esta forma trabajo yo con Netbeans Platform
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();
}
}
Estos son sus metodos
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();
}
}
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) elEntityManagerFactory
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 objetosEntityManager
y otras cosas que no recuerdo bien... el punto es que debería haber sólo un objeto deEntityManagerFactory
en la aplicación.En cambio, el
EntityManagerFactory
gestiona a losEntityManager
, 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 objetoEntityManager
, 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.
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 losEntityManager
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
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);
}
}
}
---------------------------------------------------------------------------------------------
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
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
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
Te paso mis repositorios de trabajo
https://www.dropbox.com/sh/oafx1dwqrmpzv5i/mqVwlwc-Oy?m
https://www.dropbox.com/sh/lzp4qhppzgfqjfk/Ty0HL-IK86?m
https://www.dropbox.com/sh/g6oyabq13sh6n6u/qohYKUHDVy?m
https://www.dropbox.com/s/nmxz43ii24itbn1/BD_AVANZADO%20II.rar?m
https://www.dropbox.com/s/7ssvidtxg40im08/ProyectoLP1_4%C2%B0%20Avance.r...