Último minuto

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
    @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))