Im getting this exception when i try to manipulate more than one objects in the DB in one run. No matter what choice i choose the same problem happens again and again. It seems that is related that the connection gets disconnected in some point that im not capable to see it.
Exception:
Main:
public class NotasBDOR {
public static void main(String[] args) {
int menu = 10;
Scanner sc = new Scanner(System.in);
GestorDB4o gestor = new GestorDB4o();
do{
System.out.println("1.- Insertar profesor");
System.out.println("2.- Eliminar profesor");
System.out.println("3.- Validar la entrada de un profesor");
System.out.println("4.- Validar la entrdada de un alumno");
System.out.println("0.- Salir");
menu = sc.nextInt();
switch(menu){
case 1:
Profesor p = new Profesor();
String nombreProfesor;
String nombreUsuarioProfesor;
String passwordProfesor;
System.out.println("Introduzca el nombre :");
nombreProfesor = sc.next();
System.out.println("Introduzca el nombre de usuario: ");
nombreUsuarioProfesor = sc.next();
System.out.println("Introduzca el password: ");
passwordProfesor = sc.next();
p = new Profesor(nombreProfesor,nombreUsuarioProfesor,passwordProfesor);
gestor.guardarProfesor(p);
gestor.cerrar();
break;
case 2:
System.out.println("Introduzca el nombre de usuario:");
nombreUsuarioProfesor = sc.next();
gestor.eliminarProfesor(nombreUsuarioProfesor);
gestor.cerrar();
break;
case 3:
System.out.println("Introduzca el nombre de usuario: ");
nombreUsuarioProfesor = sc.next();
System.out.println("Introduzca el password: ");
passwordProfesor = sc.next();
if(gestor.validarProfesor(nombreUsuarioProfesor, passwordProfesor)){
System.out.println("Bienvenido "+nombreUsuarioProfesor+" !");
}else{
System.out.println("Se han introducido unas credenciales incorrectas");
}
gestor.cerrar();
break;
case 4:
System.out.println("Introduzca el nombre de usuario: ");
String nombreUsuarioAlumno = sc.next();
System.out.println("Introduzca el password: ");
String passwordAlumno = sc.next();
if(gestor.validarAlumno(nombreUsuarioAlumno, passwordAlumno)){
System.out.println("Bienvenido "+nombreUsuarioAlumno+" !");
}else{
System.out.println("Se han introducido unas credenciales incorrectas");
}
gestor.cerrar();
break;
}
}while(menu!=0);
}
}
Profesor:
public class Profesor {
private static AtomicInteger cont = new AtomicInteger();
private int id;
private String nombre;
private String nombre_usuario;
private String password;
public Profesor(){
}
public Profesor(String nombre, String nombre_usuario, String password){
this.id = cont.incrementAndGet();
this.nombre = nombre;
this.nombre_usuario = nombre_usuario;
this.password = password;
}
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the nombre
*/
public String getNombre() {
return nombre;
}
/**
* @param nombre the nombre to set
*/
public void setNombre(String nombre) {
this.nombre = nombre;
}
/**
* @return the nombre_usuario
*/
public String getNombre_usuario() {
return nombre_usuario;
}
/**
* @param nombre_usuario the nombre_usuario to set
*/
public void setNombre_usuario(String nombre_usuario) {
this.nombre_usuario = nombre_usuario;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString(){
return "id: "+id+" nombre: "+nombre+" nombre_usuario: "+nombre_usuario;
}
}
GestorDB4o:
package notaslinkiadb4o;
import com.db4o.Db4oEmbedded;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import java.util.List;
/**
*
* @author Lluis
*/
public class GestorDB4o {
private ObjectContainer base_datos;
public GestorDB4o(){
base_datos = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), "notaslinkia");
}
public void cerrar(){
base_datos.close();
}
public void guardarProfesor(Profesor p){
base_datos.store(p);
System.out.println("Profesor guardado: "+p.getNombre());
}
public void guardarAlumno(Alumno a){
base_datos.store(a);
System.out.println("Alumno guardado: "+a.getNombre());
}
public void eliminarProfesor(String nombre_usuario){
Profesor p = new Profesor(null,nombre_usuario,null);
ObjectSet result = base_datos.queryByExample(p);
System.out.println(result.size());
while(result.hasNext()){
Profesor found = (Profesor) result.next();
base_datos.delete(found);
System.out.println("Profesor borrado: "+found.getNombre_usuario());
}
}
public boolean validarProfesor(String nombre_usuario, String password){
Profesor p = new Profesor(null,nombre_usuario,password);
ObjectSet result = base_datos.queryByExample(p);
while(result.hasNext()){
Profesor found = (Profesor) result.next();
return true;
}
return false;
}
public boolean validarAlumno(String nombre_usuario, String password){
Alumno a = new Alumno(0,null,nombre_usuario,password,0,null);
ObjectSet result = base_datos.queryByExample(a);
while(result.hasNext()){
Alumno found = (Alumno) result.next();
return true;
}
return false;
}
public int tamanoProfesor(){
List<Profesor> profesores = base_datos.query(Profesor.class);
return profesores.size();
}
}
@user207421 is right
gestor.cerrar()
before every break
will be close the database connection
you should new GestorDB4o()
in each loop
like this
do{
GestorDB4o gestor = new GestorDB4o();
System.out.println("1.- Insertar profesor");
System.out.println("2.- Eliminar profesor");
System.out.println("3.- Validar la entrada de un profesor");
System.out.println("4.- Validar la entrdada de un alumno");
System.out.println("0.- Salir");
menu = sc.nextInt();
switch(menu){
//....
}
}while(menu!=0)
a better way is Do not call gestor.cerrar()