2011-06-14 8 views
8

Estoy usando Hibernate para acceder a MySQL, y tengo una tabla con una clave primaria de incremento automático.Cómo obtener el valor de la clave primaria de auto-incremento en MySQL usando Hibernate

Cada vez que inserte una fila en la tabla, no es necesario que especifique la clave principal. Pero después de insertar una nueva fila, ¿cómo puedo obtener la clave principal relativa inmediatamente usando hibernación?

O simplemente puedo usar jdbc para hacer esto?

Respuesta

10

Al guardar la entidad de hibernación, se completará la propiedad id. Así que si usted tiene

MyThing thing = new MyThing(); 
... 

// save the transient instance. 
dao.save(thing); 

// after the session flushes, thing.getId() should return the id. 

que en realidad casi siempre hacer una assertNotNull en la identificación de una entidad persistía en mis pruebas para asegurarse de que el trabajado de modificaciones.

+0

¿Esto sucede incluso si transacción no se confirma y la sesión aún no está cerrado. – Ace

2

Una vez que haya persistido el objeto, debería poder llamar a getId() o cualquiera que sea su columna @ID, para que pueda devolver eso desde su método. También podría invalidar la memoria caché de primer nivel de Hibernate y recuperarla nuevamente.

Sin embargo, para la portabilidad, es posible que desee ver el uso de Hibernate con la generación de ID de estilo de secuencia. Esto facilitará la transición de MySQL si alguna vez lo necesita. Ciertamente, si se utiliza este tipo de generador, usted será capaz de obtener el ID de inmediato, ya que Hibernate tiene que resolver el valor de la columna antes de que persiste el objeto:

@Id 
@GeneratedValue (generator="MY_SEQ") 
@GenericGenerator(name = "MY_SEQ", 
    strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", 
    parameters = { 
     @Parameter(name = "sequence_name", value = "MY_SEQ"), 
     @Parameter(name = "initial_value", value = "1"), 
     @Parameter(name = "increment_size", value = "10") } 
     ) 
@Column (name = "id", nullable = false) 
public Long getId() { 

     return this.id; 
    } 

Es un poco más complejo, pero es el tipo de cosa que puedes cortar y pegar, aparte de cambiar el nombre de SEQUENCE.

0

Cuando llama a un método save() en Hibernate, el objeto no se escribe en la base de datos inmediatamente. Ocurre cuando intentas leer de la base de datos (¿de la misma tabla?) O llamas explícitamente a flush(). Hasta que el registro correspondiente no se inserte en la tabla de la base de datos, MySQL no asignaría una identificación para ello.

Por lo tanto, la identificación está disponible, pero no antes de que Hibernate realmente inserte el registro en la tabla de MySQL.

0

Si lo desea, puede obtener la clave principal al lado de forma independiente de un objeto usando:

Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession(); 
Query query = session.createSQLQuery("select nextval('schemaName.keySequence')"); 

Long key = (Long) query.list().get(0); 
return key; 
0

bien en el caso de la clase de generador de incremento automático, cuando usamos el método save() devuelve la clave principal (suponiendo es id). Por lo que vuelve ese particular id, por lo que puede hacer esto

int id = session.save(modelClass); 

Y volver id

Cuestiones relacionadas