El problema del AUTO_INCREMENT con el API de Persistencia
Al crear una clase entidad utilizando el API de persistencia (JPA) con Netbeans, el IDE creará por omisión los ID con las siguientes anotaciones
Con ello creará una tabla llamada SEQUENCE donde almacenará el valor del último ID utilizado. Es lo más estándar posible, ya que sabemos que existen RDBMS que no tienen la capacidad de generar un ID autoincrementado (como el Firebird, que necesita de un generator).
Pero ¿si uso MySQL, Apache Derby (o un RDBMS que pueda permitir valores de ID autoincrementales)? Pues, si revisamos la documentación de Java
http://java.sun.com/javaee/5/docs/api/javax/persistence/GenerationType.html#SEQUENCE
dice textualmente " Indicates that the persistence provider must assign primary keys for the entity using database sequence column."
entonces, la anotación que necesitamos es
Para salir de las dudas, al ejecutar nuestra aplicación, veremos que en la carpeta del proyecto (Ctrl + 2 en Netbeans) veremos archivos de extensión .sql: createDDL.sql y dropDDL.sql. Abrimos el primero y veremos que hay un sql como este:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Con ello creará una tabla llamada SEQUENCE donde almacenará el valor del último ID utilizado. Es lo más estándar posible, ya que sabemos que existen RDBMS que no tienen la capacidad de generar un ID autoincrementado (como el Firebird, que necesita de un generator).
Pero ¿si uso MySQL, Apache Derby (o un RDBMS que pueda permitir valores de ID autoincrementales)? Pues, si revisamos la documentación de Java
http://java.sun.com/javaee/5/docs/api/javax/persistence/GenerationType.html#SEQUENCE
dice textualmente " Indicates that the persistence provider must assign primary keys for the entity using database sequence column."
entonces, la anotación que necesitamos es
@GeneratedValue(strategy = GenerationType.SEQUENCE)
Para salir de las dudas, al ejecutar nuestra aplicación, veremos que en la carpeta del proyecto (Ctrl + 2 en Netbeans) veremos archivos de extensión .sql: createDDL.sql y dropDDL.sql. Abrimos el primero y veremos que hay un sql como este:
CREATE TABLE PERSONA (ID BIGINT AUTO_INCREMENT NOT NULL, NOMBRE VARCHAR(255), EDAD INTEGER, PRIMARY KEY (ID))
... si hemos usado MySQL, mientras que con Apache Derby, se mostraría así:CREATE TABLE PERSONA (ID BIGINT GENERATED ALWAYS AS IDENTITY NOT NULL, NOMBRE VARCHAR(255), EDAD INTEGER, PRIMARY KEY (ID))
Comentarios
Publicar un comentario
Si quieres hacer una pregunta más específica, hazla en los foros que tenemos habilitados en Google Groups
Ah! solo se permiten comentarios de usuarios registrados. Si tienes OpenID, bienvenido! Puedes obtener su OpenID, aquí: http://openid.net/