Tengo un problema con un registro, por favor me podrían asesorar?

Que tal amigos de Java Mexico,

Estoy realizando un sistema básico de inventario, pero tengo un consulta a ver si alguien me pudiera asesorar.

Resulta que tengo una ventana con una tabla donde muestro los empleados que estan registrados en la base de datos
tengo un boton para añadir otro empledo, al darle clic me habre otra ventana en la cual tengo un formulario de registro
el cual tiene los campos de:

Empleado ID:
Nombre:
Apellido:
Dirección:
Ciudad:

etcétera ...

En el campo de texto de Empleado ID esta como setEditable(false);
ya que los ID's de mis empleados estan seriados se podria decir SNA0001, SNA00002, SNA00003 etc,
entonces en ese campo de texto debe aparecer la serie que sigue, si tengo 3 empleados registrados el que tendria
que aparecer automaticamente en ese campo de texto seria SNA00004, y no se que estoy haciendo mal,
no se si sea mi base de datos o mi codigo, porque en lugar que aparezca el que sigue, aparece el SNA00001 y obviamente
al terminar de llenar el formulario me dira que no puedo añadir otro empleado con el mismo ID, no se si me explique bien,lo que quiero es que
vaya autoincrementando con esa serie de SNA0000x ojala me puedan ayudar por favor, añado parte del codigo del metodo que
consulta la base de datos e imprime el empleadoID al campo de texto,

 

dejo una imagen de mi registro, no se aprecia bien, pero el primer JTextField no se puede editar y ahí me tiene que ir incrementando la serie

Gracias y saludos a todos!.

AdjuntoTamaño
empleadoform.JPG31.22 KB

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 ezamudio

Momento de asignación

El momento en que se asigna el ID al nuevo registro debe ser cuando ya se hace la inserción, no cuando comienza la edición de datos. Si asignas el ID cuando comienzas a editar, qué pasa si el usuario se queda sin luz o le da un infarto y se lo llevan al hospital y se queda la edición a medias? Otro caso es que tengas dos o más usuarios haciendo la misma acción: van a meter registros nuevos, y solamente hay 3 registros; los tres comienzan a editar y como hay 3 registros, a los 3 usuarios les sale que el nuevo ID será el 4.

Si no te importa que se queden algunos ID sin usarse, puedes asignarlos al momento que comienza la edición pero tiene que haber un proceso sincronizado en la base de datos para obtener ese nuevo ID (o sea, que solamente un proceso lo puede invocar a la vez). De esa manera si 3 usuarios van a empezar a insertar, a uno le saldrá el ID 4, a otro el 5 y a otro el 6. Algunas bases de datos soportan secuencias; si la que usas no soporta secuencias tendrás que hacerlo a mano con una tabla de ID's la cual tienes que bloquear, leer el registro que quieres actualizar, incrementarlo, actualizar en la base de datos y devolver el valor (puedes hacer un stored procedure o función en la base de datos, o puedes hacer eso en Java con un método marcado como  ).
Si necesitas que los ID's siempre queden seguiditos entonces necesitas hacer todo en una transacción en la base de datos: obtener el nuevo ID (bloqueando a los demás procesos), insertar y si todo sale bien, commit y listo, el siguiente proceso puede insertar. Pero si algo sale mal das rollback y no se incrementa el ID.

Wow gran explicación

Muchas gracias ezamudio, la verdad es que no tenia idea, pero no, realmente no quiero que lleven un orden, puse ese ejemplo mas que nada por que lo que me interesa es que lleven esa serie de SNAxxxx ahí pueden ser números al azar, intentare eso que me comentas, hacerlo cuando se hace la inserción.

De antemano muchas gracias.

Imagen de ezamudio

al azar?

Tu llave primaria va a ser un número aleatorio? Y qué pasa si por... azares del destino... obtienes un número que ya está en la base de datos?

Pues podría generar los

Pues podría generar los números aleatorios y después realizar una consulta, se podría implementar un algoritmo recursivo que compruebe si el numero que se genero existe en la tabla, si existe pues que vuelva a generar el numero aleatorio ...

En la experiencia que tienes, es recomendable eso que te menciono?, es que ya asigne el ID cuando se hace la inserción, pero no da... me sigue poniendo solamente el ultimo numero del registro de la base de datos, en lugar de que me muestre el siguiente alguna otra manera de conseguir lo que deseo realizar?

Muchas gracias por todo.

Imagen de ezamudio

algoritmo

Modifica tu algoritmo. Asignas el ID al hacer la inserción pero seguramente el valor es el número de registros existentes. Eso no sirve porque en cuanto se borra un registro vas a tener broncas: tienes 3 registros con llaves 1, 2, 3. Insertas un cuarto registro y cuentas los que hay: 3 le sumas uno y tienes 4, le pones llave 4 y lo insertas. Ahora borras el primer registro, te quedas con los que tienen llave 2,3,4. Cuando quieras insertar otro registro vas a contar que tienes 3, le sumas 1, y vas a querer usar el 4 pero esa llave ya está en uso.

Si usas PostgreSQL, usa secuencias. Si usas MySQL, ponle auto-assign o auto-increment (algo así se llama) a la llave primaria. En Oracle me parece que también hay algo como las secuencias de PostgreSQL. En SQLServer no tengo idea porque no había ninguna de las dos cosas la última vez que la usé pero seguro que ya hay algo ahora.

Si necesitas resolver lo de la llave para varias tablas y no quieres usar lo que te ofrece tu RDBMS, un modelo clásico y portable es crear una tabla con dos columnas: tabla (varchar) y llave (entero). Cada registro consiste en el nombre de la tabla y la última llave que se utilizó para insertar. El algoritmo para insertar un nuevo registro es: hacer todo esto en una transacción:

SELECT llave FROM llave_tabla WHERE tabla='mi_tabla_donde_quiero_insertar' FOR UPDATE;
//luego le asignas llave+1 al registro nuevo
INSERT INTO mi_tabla_donde_quiero_insertar (blabla) values (blabla)
UPDATE llave_tabla SET llave=llave+1 WHERE tabla='mi_tabla_donde_quiero_insertar';

El FOR UPDATE del primer SELECT es importante porque bloquea el registro para que ningún otro proceso pueda leer ese registro hasta que termines la transacción.

Que tal ezamudio mira ...

así mando llamar el método para que imprima el numero en el campo de texto de Empleado ID

 

Después creo un método para insertar y actualizar ... ( Solo es una parte del método).

 

Y el metodo para obtener el empleadoID

 

Si no es mucha molestia me podrías asesorar sobre el código?

de antemano muchísimas gracias.

PD: Como sistema de base de datos uso MySQL.