Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > [JPA - Derby] PK AI aumenta en intérvalos incorrectos.

Hola, muy buenos días con todos. Estoy empezando con Derby y JPA y entiendo más o menos cómo funciona.

Bien tengo una entidad - tabla llamada Planilla, en donde estarán los trabajadores de una empresa.


@Entity
@Table (name="planilla")
public class Planilla implements Serializable{

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE)
@Column (name = "id_trabajador")
@Basic (optional=false)
private Integer id_trabajador;
@Column (name="codigo")
@Basic (optional=false)
private String codigo;
@Column (name = "nombre")
@Basic (optional=false)
private String nombre;
@Column( name = "dni")
@Basic (optional=false)
private String dni;
@Column (name = "cargo")
@Basic (optional=false)
private String cargo;
@Column (name = "email")
@Basic (optional=false)
private String email;
@Column (name = "fecha_nac")
@Basic (optional=false)
private String fechaNac;
@Column (name = "direccion")
@Basic (optional=false)
private String direccion;
@Column (name = "telefono")
@Basic (optional=false)
private String telefono;

public Planilla() {}

public Planilla(Integer id) {
this.id_trabajador = id;
}

public Integer getId_trabajador() {
return id_trabajador;
}

public void setId_trabajador(Integer id_trabajador) {
this.id_trabajador = id_trabajador;
}

public String getCodigo() {
return codigo;
}

public void setCodigo(String codigo) {
this.codigo = codigo;
}

public String getNombre() {
return nombre;
}

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


public String getDni() {
return dni;
}

public void setDni(String dni) {
this.dni = dni;
}

public String getCargo() {
return cargo;
}

public void setCargo(String cargo) {
this.cargo = cargo;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getFechaNac() {
return fechaNac;
}

public void setFechaNac(String fechaNac) {
this.fechaNac = fechaNac;
}

public String getDireccion() {
return direccion;
}

public void setDireccion(String direccion) {
this.direccion = direccion;
}

public String getTelefono() {
return telefono;
}

public void setTelefono(String telefono) {
this.telefono = telefono;
}


}

id_trabajador es la PK, y es Autoincrementable. Su tipo de generacion es SEQUENCE, lo he intentado con TABLE, AUTO, pero sucede lo mismo. Me genera un intérvalo de 100, si el primero tiene un ID de 1, el segundo tendrá uno de 101, el otro 201 y así sucesivamente. Les dejo una screenshot para que vean:

http://i.imgur.com/Wx29uJ7.png

Aprovecho para hacerles otra consulta. ¿Cómo se trabajan las relaciones en JPA? Por ejemplo, ¿Qué tipo de relaciones puedo establecer aquí? Por ejemplo, con otras tablas?


Muchas gracias amigos, y disculpen hacerles perder el tiempo. Mil gracias.

diciembre 13, 2013 | Registered CommenterJFK

Presidente Kennedy, antes que nada le recomiendo postear esta pregunta en el foro JavaEE de este mismo portal. El tópico que maneja lo amerita.

Segundo, no entiendo su duda o pregunta. ¿Quiere saber porque razón se da ese intervalo de 100 números?

Respecto a las relaciones, primero revise documentación básica del tema (por ejemplo el tutorial de JavaEE oficial que publica Oracle). A partir de allí podríamos intentar resolver dudas particulares que tuviera. Es la forma de trabajar de estos foros.

Por último, le recomiendo que elabore una pregunta por cada thread del foro.

diciembre 13, 2013 | Registered Commenterantoniovl

Respecto a los incrementos de 100 en 100: No es incorrecto lo que ves, al menos con la estrategia basada en una tabla.

Cada vez que requieres una llave primaria, JPA no acude a la base de datos para generar un número. Para el primer "insert", comienza del número 1 y guarda un 50 (que es el rango por default para la estrategia basada en una tabla) en la secuencia. Ese contador lo va llevando en memoria, y cada vez que se requiere una PK entrega un número directamente de la cuenta que va llevando.

En tu caso particular, ves una PK con valor 1 porque solamente hiciste un insert (o persist) antes de terminar la ejecución de tu programa. La segunda vez que lo corriste, JPA encontró que el último rango comienza del 100, y al hacer un insert genera la PK con valor 101. Esto se hace por eficiencia, y funciona perfectamente porque la función de la PK es ser única, no es obligatorio que sea estrictamente secuencial.

Si necesitas llevar algún tipo de consecutivo para tus registros, lo recomendado es que lo manejes en otra columna.

diciembre 13, 2013 | Registered Commenterantoniovl