secundaria primaria llave foranea crear compuesta clave java mysql hibernate

java - foranea - crear llave primaria sql server



Hibernate no respeta el campo de clave principal de autoinforme de MySQL (5)

Estoy tratando de aprender cómo funciona Hibernate, y me encuentro en una curva de aprendizaje casi inaceptable. No puedo ver cómo hacer que Hibernate respete la política de auto_increment para mis objetos. En su lugar, está sobrescribiendo las entradas en la base de datos con ID existentes, comenzando con 1.

Tengo un objeto Foo simple, respaldado por una tabla MySQL definida como esta:

CREATE TABLE `Foo` ( `fooId` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`fooId`), )

He confirmado que insertar múltiples objetos Foo a mano con SQL ( insert into Foo values(); ) hace lo correcto.

Mi clase Java tiene el ID especificado usando anotaciones como esta:

@Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="fooId") private Integer id;

Luego ejecuto un código de prueba que simplemente crea una instancia de los objetos de Foo y los guarda en la base de datos (usando session.save(obj) ). Parece que usa su propia secuencia de clave primaria, comenzando con una, y no mira la política de claves de la tabla. Sobrescribe todo lo que estaba allí.

He intentado variaciones en el bit @GeneratedValue (usando todas las estrategias posibles, dejando de lado la cláusula paréntesis). Alguien incluso sugirió dejar por completo el valor de GeneratedValue . Nada parece funcionar.

¿Estoy dejando algo fuera? ¿Qué me estoy perdiendo? ¿Es Hibernate realmente tan difícil?

(Si alguien tiene una opción de persistencia de base de datos Java alternativa, sugiera una. Estoy haciendo prototipos, no proyectos mondo-diseñados de larga duración).



Creo que quieres GenerationType.IDENTITY . MySql no usa una tabla o secuencia para generar el valor de Id.


Es posible que desee echar un vistazo a: http://hibernatepojoge.sourceforge.net/

Pretende crear una aplicación completamente operativa (spring, hibernate, junit tests, etc.) simplemente apuntándola a un DB.


Escribí esto en un comentario debajo de la respuesta aceptada, pero no se muestran de forma predeterminada, por lo que volveré a publicarlo como una respuesta.

Estaba usando un archivo hibernate.cfg.xml en el sitio web de algún amigo, y tenía esto:

<property name="hibernate.hbm2ddl.auto">create</property>

Esto hizo que el sistema volviera a crear mi mesa cada vez que ejecutaba mi aplicación. Comentarlo solucionó el problema.

Las otras dos respuestas sobre las diversas formas de crear identificaciones son correctas. El síntoma de mi problema original parecía estar relacionado con la generación de ID, pero la causa real era una mala configuración.


Yo uso lo siguiente con auto_increment, funciona perfectamente:

@Id @GeneratedValue(strategy = IDENTITY) @Column(name = "db_id", unique = true, nullable = false) public Long getDbId() { return this.dbId; } public void setDbId(Long dbId) { this.dbId = dbId; }