Estoy intentando aprender cómo funciona Hibernate, y me estoy encontrando con una curva de aprendizaje casi inaceptable. No veo cómo lograr que Hibernate respete la política auto_increment para mis objetos. En su lugar, es sobrescribir las entradas de la base de datos con identificadores existentes, comenzando con 1.Hibernate no respeta el campo clave de MySQL auto_increment
Tengo un simple objeto Foo
, respaldado por una tabla de MySQL se define así:
CREATE TABLE `Foo` (
`fooId` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`fooId`),
)
He confirmado que la inserción de múltiples Foo objetos a mano con SQL (insert into Foo values();
) hace lo correcto.
clase Mi Java tiene el ID especifica mediante anotaciones como esto:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="fooId")
private Integer id;
entonces ejecutar algún código de prueba que simplemente ejecuta objetos Foo y los guarda en la base de datos (usando session.save(obj)
). Parece que usa su propia secuencia de teclas primaria, comenzando con una, y no mira la política clave de la tabla. Sobrescribe lo que haya allí.
He intentado variaciones en el bit @GeneratedValue
(usando todas las estrategias posibles, dejando fuera la cláusula parentética). Alguien incluso sugirió dejar el GeneratedValue
por completo. Nada parece funcionar.
¿Estoy dejando algo en claro? ¿Qué me estoy perdiendo? ¿Es Hibernate realmente tan difícil?
(Si alguien tiene una opción alternativa de persistencia de base de datos de Java, por favor sugerir una. Estoy haciendo prototipos, no mondo proyectos de ingeniería de larga duración.)
+1 para "curva de aprendizaje casi inaceptable" –
Ídem. Hibernate no es tan suave como EJB2, y mucho de esto tiene que ver con desarrolladores que se niegan a admitir cosas por razones técnicas. – Zds
Hibernate 5.x ya no usa IDENTIDAD cuando especifica GenerationType.AUTO. En su lugar, busca la tabla hibernate_sequence para la próxima identificación. – Mohsen