2009-02-24 17 views
18

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

+9

+1 para "curva de aprendizaje casi inaceptable" –

+0

Í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

+0

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

Respuesta

28

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

+0

Hola Clint, y gracias por la respuesta. Tienes razón. Pero eso inicialmente no resolvió mi problema, porque tenía un problema sutil y odioso subyacente en todo. Publicaré mi respuesta debajo de mi pregunta original. –

+3

Er, he cambiado de parecer, solo lo responderé aquí. que estaba usando un hibernate.cfg.xml presentar fuera del sitio web de un tío, y tenía la siguiente: crear Esto hizo que el sistema para volver a crear mi tabla cada vez que ejecuté mi aplicación. Comentar solucionó el problema. –

+0

Hombre, tuve exactamente el mismo problema con create, thx para encontrarlo; p – finpingvin

1

utilizo lo siguiente con AUTO_INCREMENT, funciona a la perfección:

@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; 
} 
5

escribí esto en un comentario debajo de la respuesta aceptada, pero los que no se muestran de manera predeterminada, así que volveré a publicarlo como respuesta.

que estaba usando un hibernate.cfg.xml presentar fuera del sitio web de un tío, y que tenía la siguiente:

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

Esto hizo que el sistema para volver a crear mi mesa cada vez que me encontré con mi aplicación. Comentar 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 tener relación con la generación de ID, pero la causa real era una configuración incorrecta.

+0

También puede establecer ese valor para 'actualizar' si solo desea que coincida automáticamente con la base de datos a su configuración sin dejando caer los datos. Los documentos: https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/session-configuration.html#configuration-misc-properties – rjferguson

0

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

Se pretende crear una aplicación totalmente funcional (Spring, Hibernate, pruebas junit, etc) con sólo apuntar a una base de datos.

Cuestiones relacionadas