Problemas con vectores JSP/JavaBean

crainar
10 de Junio del 2004
Hola a todos, tengo un problema con un vector.

Quiero guardar en el vector un objeto por cada registro, en concreto quiero guardar una clase que se llama usuario y en ella hay varios metodos get y set para guardar en ella los valores de cada registro de la BBDD.

Mi diea es conseguir guardar la tabla usuarios en el vector, siendo cada registro una instancia de la clase preparada con los metodos get... y set... metida en un "registro" del vector mediante el metodo vector.add(index,object)

El problema es que cuando recupero el vector igualandolo a otro vector, y al mostrar los resultados utilizando mis metodos de la clase tras recuperarlos siempre recupero el ultimo valor, es decir, en todos ellos, se guarda el ultimo registro, siendo desde el primero al ultimo iguales!!!

Creo que es por algun problema con la clase en la que guardo cada registro o el ADD o algo asi. (alguna pista o idea?

os pongo parte del codigo clave:


Esta es la clase en la que guardare cada registro:
package crainar;

public class UsuariosTabla {

private String nombre;
private String apellido1;
private String apellido2;
private int tipoTurno;
private String excepciones;
private int ID_USER;

public UsuariosTabla() {

}

public String getNombre() {
return this.nombre;
}

public String setNombre(String nombreAct) {
this.nombre = nombreAct;
return this.nombre;
}

public String getApellido1() {
return this.apellido1;
}

public String setApellido1(String apellido1Act) {
this.apellido1 = apellido1Act;
return this.apellido1;
}

public String getApellido2() {
return this.apellido2;
}

public String setApellido2(String apellido2Act) {
this.apellido2 = apellido2Act;
return this.apellido2;
}

public int getTipoTurno() {
return this.tipoTurno;
}

public int setTipoTurno(int tipoTurnoAct) {
this.tipoTurno = tipoTurnoAct;
return this.tipoTurno;
}

public String getExcepciones() {
return this.excepciones;
}

public String setExcepciones(String excepcionesAct) {
this.excepciones = excepcionesAct;
return this.excepciones;
}

public int getID_USER() {
return this.ID_USER;
}

public int setID_USER(int ID_USERAct) {
this.ID_USER = ID_USERAct;
return this.ID_USER;
}

}//fin clase




ESTE ES EL EL METODO DEL JAVABEAN QUE TRABAJA CON LAS BBDD, VECTOR Y LA CLASE USUARIO:

public static Vector getUsuarios() throws Exception {

Vector devuelta = new Vector ();; //voy a intentar devolver el cursor
UsuariosTabla usuario = new UsuariosTabla();

//Creamos una sentencia para la introducción de valores
Statement stm = conn.createStatement();
ResultSet rs = stm.executeQuery("SELECT nombre,apellido1,apellido2,ID_USER,TipoTurno,Excepciones FROM usuarios");

System.out.println("La conexion se ha establecido correctamente con la instancia TURNOGUARDIAS");

for (int lac = 0; rs.next(); lac ++) {
//rs.next();
//devuelta.add (lac, new UsuariosTabla()); // solo saca nulls
usuario.setNombre(rs.getString("nombre"));
usuario.setApellido1(rs.getString("apellido1"));
usuario.setApellido2(rs.getString("apellido2"));
usuario.setID_USER(rs.getInt("ID_USER"));
usuario.setTipoTurno(rs.getInt("TipoTurno"));
usuario.setExcepciones(rs.getString("Excepciones"));
***************** devuelta.add (lac, usuario);
System.out.println("Nombres: " + usuario.getNombre() + " " + usuario.getApellido1() + " " + lac);
}

// Prueba para ver si introduzco bien el vector con el objeto
###### usuario = (UsuariosTabla)devuelta.get(1);
###### System.out.println("BRA1 " + usuario.getApellido1());
##### usuario = (UsuariosTabla)devuelta.get(2);
##### System.out.println("BRA2 " + usuario.getApellido1());

rs.close();
stm.close();
conn.close();
System.out.println("Fin conexion con Base de Datos instancia TURNOGUARDIAS...");


return devuelta;

}



LAS LINEAS CON LOS ASTERISCOS ES DONDE AÑADO AL VECTOR LA CLASE, Y LAS DE LAS # DONDE RECUPERO CADA UNO DE LOS REGISTROS, EN CONCRETO 2 NADA MAS.
eL RESULTADO QUE OBTENGO ES QUE EN LOS DOS REGISTROS QUE RECUPERO RECUPERO LOS MISMOS DATOS!!!!

ALGUNA IDEA POR FAVOR!!!!

Gracias de antemano.

kiffa
10 de Junio del 2004
Hola, lo que pasa es que con la sentencia usuariosTabla usuario = new UsuariosTabla(); se crea un nuevo objeto, luego al llenarlo en el ciclo for este
objeto se va modificando, hasta ahi todo va bien, pero al insertarlo al vector por medio de devuelta.add (lac, usuario); se esta ingresando el mismo objeto aunque
los datos internos cambien, es decir, en la clase vector no se guardan los objetos, sino la referencia a estos, por esto al final queda el vector como si
estuviera repetido el ultimo ingresado. Esto se soluciona creando un nuevo objeto en cada ciclo for. Espero que sea de ayuda.

crainar
10 de Junio del 2004
Hola soy yo de nuevo, me he autosoluconado el problema, implementando en la clase usuarios un metodo que sobrecarga al constructor al cual se le pasan los parametros que quiero que me guarde y añadiendo en el bean, o mejor dicho sustituyendo:

devuelta.add (lac, usuario);
por:
devuelta.add (lac, new UsuariosTabla(rs.getString("nombre"),rs.getString("apellido1"),rs.getString("apellido2"),rs.getInt("TipoTurno"),rs.getString("Excepciones"),rs.getInt("ID_USER")));

(Además e corregido un problema de implementacion de la clase Usuarios, pero no afectaba al funcionamiento)

Pero, ¿Por que no me funcionaba con los metodos set... de la clase usuario metiendolos en el vector?¿Como se haria con los metodos set sin usar el constructor nuevo de la clase usuario?

Gracias y saludos!!!