Directamente al grano, el problema es guardar el objeto Operator en MySQL DB. Antes de guardar, trato de seleccionar de esta tabla y funciona, también lo es la conexión a db.
Aquí está mi objeto Operador:
@Entity
public class Operator{
@Id
@GeneratedValue
private Long id;
private String username;
private String password;
private Integer active;
//Getters and setters...
}
Para salvar utilizo EntityManager
el persist
método de JPA .
Aquí hay un registro:
Hibernate: insert into Operator (active, password, username, id) values (?, ?, ?, ?)
com.mysql.jdbc.JDBC4PreparedStatement@15724a0: insert into Operator (active,password, username, id) values (0, 'pass', 'user', ** NOT SPECIFIED **)
A mi modo de ver, el problema es la configuración con incremento automático, pero no puedo averiguar dónde.
Probé algunos trucos que he visto aquí: Hibernate no respeta el campo de clave primaria auto_increment de MySQL Pero nada de eso funcionó
Si se necesitan otros archivos de configuración, se los proporcionaré.
DDL:
CREATE TABLE `operator` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(40) NOT NULL,
`last_name` VARCHAR(40) NOT NULL,
`username` VARCHAR(50) NOT NULL,
`password` VARCHAR(50) NOT NULL,
`active` INT(1) NOT NULL,
PRIMARY KEY (`id`)
)
Respuestas:
Para usar una
AUTO_INCREMENT
columna MySQL , se supone que debe usar unaIDENTITY
estrategia:Que es lo que obtendría al usar
AUTO
con MySQL:Lo que en realidad es equivalente a
En otras palabras, su mapeo debería funcionar. Pero Hibernate debería omitir la
id
columna en la declaración de inserción de SQL, y no es así. Debe haber una especie de desajuste en alguna parte.¿Especificó un dialecto MySQL en su configuración de Hibernate (probablemente
MySQL5InnoDBDialect
oMySQL5Dialect
dependiendo del motor que esté usando)?Además, ¿quién creó la mesa? ¿Puede mostrar el DDL correspondiente?
Seguimiento: no puedo reproducir su problema. Usando el código de su entidad y su DDL, Hibernate genera el siguiente SQL (esperado) con MySQL:
Tenga en cuenta que la
id
columna está ausente de la declaración anterior, como se esperaba.En resumen, su código, la definición de la tabla y el dialecto son correctos y coherentes, debería funcionar. Si no es así para usted, tal vez algo no esté sincronizado (haga una compilación limpia, revise el directorio de compilación, etc.) o algo más no esté bien (revise los registros para ver si hay algo sospechoso).
En cuanto al dialecto, la única diferencia entre
MySQL5Dialect
oMySQL5InnoDBDialect
es que el último agregaENGINE=InnoDB
objetos a la tabla al generar el DDL. Usar uno u otro no cambia el SQL generado.fuente
@GeneratedValue(strategy=GenerationType.IDENTITY)
cuando escribes@GeneratedValue(strategy=GenerationType.AUTO)
y@GeneratedValue
. Así que tenga cuidado y trate de ser detallado.Usando MySQL, solo este enfoque funcionó para mí:
Los otros 2 enfoques declarados por Pascal en su respuesta no me funcionaron.
fuente
JPA
conspring-boot
yMySQL
.Para cualquiera que lea esto y esté usando EclipseLink para JPA 2.0, aquí están las dos anotaciones que tuve que usar para que JPA persistiera los datos, donde "MySequenceGenerator" es el nombre que quiera darle al generador, "myschema" es el nombre del esquema en su base de datos que contiene el objeto de secuencia, y "mysequence" es el nombre del objeto de secuencia en la base de datos.
Para aquellos que usan EclipseLink (y posiblemente otros proveedores de JPA), es CRÍTICO que establezca el atributo deploymentSize para que coincida con el valor INCREMENT definido para su secuencia en la base de datos. Si no lo hace, obtendrá una falla de persistencia genérica y perderá mucho tiempo tratando de rastrearlo, como hice yo. Aquí está la página de referencia que me ayudó a superar este desafío:
http://wiki.eclipse.org/EclipseLink/Examples/JPA/PrimaryKey#Using_Sequence_Objects
Además, para dar contexto, esto es lo que estamos usando:
Java 7 Glassfish 3.1 PostgreSQL 9.1 PrimeFaces 3.2 / JSF 2.1
Además, por el bien de la pereza, construí esto en Netbeans con los asistentes para generar Entidades de DB, Controladores de Entidades y JSF de Entidades, y los asistentes (obviamente) no saben cómo lidiar con columnas de ID basadas en secuencia, así que tendrá que agregar manualmente estas anotaciones.
fuente
Si está usando Mysql con Hibernate v3, está bien usarlo
GenerationType.AUTO
porque internamente lo usaráGenerationType.IDENTITY
, que es el más óptimo para MySQL.Sin embargo, en Hibernate v5, ha cambiado.
GenerationType.AUTO
utilizará loGenerationType.TABLE
que genera muchas consultas para la inserción.Puede evitar eso usando
GenerationType.IDENTITY
(si MySQL es la única base de datos que está usando) o con estas notaciones (si tiene varias bases de datos):fuente
fuente
Intenté todo, pero aún así no pude hacer eso, estoy usando mysql, jpa con hibernate, resolví mi problema asignando el valor de id 0 en el constructor A continuación está mi código de declaración de id
fuente
Como ha definido la identificación en el tipo int en la creación de la base de datos, también debe usar el mismo tipo de datos en la clase del modelo. Y como ha definido el ID para que aumente automáticamente en la base de datos, debe mencionarlo en la clase del modelo pasando el valor 'GenerationType.AUTO' en el atributo 'estrategia' dentro de la anotación @GeneratedValue. Entonces el código se convierte en el siguiente.
fuente
Igual que respondió pascal, solo si necesita usar .AUTO por alguna razón, solo necesita agregar las propiedades de su aplicación:
fuente
¿Puede comprobar si se ha conectado a la base de datos correcta? ya que me enfrenté al mismo problema, pero finalmente descubrí que me conecté a una base de datos diferente.
La identidad admite columnas de identidad en DB2, MySQL, MS SQL Server, Sybase y HypersonicSQL. El identificador devuelto es de tipo long, short o int.
Más información: http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/mapping.html#mapping-declaration-id
fuente
Si está utilizando MariaDB, esto funcionará
Para obtener más información, puede consultar https://thorben-janssen.com/hibernate-tips-use-auto-incremented-column-primary-key/
fuente