2011-06-07 12 views
5

Supongamos que tengo una entidad con una clave principal generada automáticamente. Ahora bien, si intento guardar la entidad con los valores de todos los otros campos que pueden no ser únicos. La entidad se llena automáticamente con la identificación de la fila que se insertó. ¿Cómo se apoderó de ese valor de clave primaria?¿Cómo hibernate los ID de los campos generados automáticamente?

EDIT:

Si la columna de clave principal es decir columna de identidad cuyo valor está totalmente decidido por la base de datos. Entonces hace una instrucción de inserción sin ese valor de columna y el db decide el valor a usar ¿comunica su decisión (no lo creo)

Respuesta

6

Hibernate use tres métodos para extraer el campo DB autogenerado dependiendo de lo que soporte el controlador jdbc o el dialecto que esté utilizando.

extracto

Hibernate valor del campo generada a poner de nuevo en el pojo:

  1. Utilizando los Statement.getGeneratedKeys método (Statement Javadocs)

    o

  2. Inserción y seleccionando el campo generado valor directamente desde la instrucción de inserción. (Dialect Javadocs)

    o

  3. Ejecución de una instrucción de selección después de la inserción para recuperar el valor de identidad generado

Todo esto se hace internamente por hibernación.

Espero que sea la explicación que está buscando.

+0

Perfecto. Exactamente lo que estaba buscando gracias. Pero realmente no obtuve el tercer punto.¿Cómo podría obtener el valor de identidad con una declaración seleccionada? Dado que los valores de la fila no son únicos, excepto el valor generado – vinothkr

+1

Es una función específica del dialecto que está utilizando. La selección no se basa en una combinación de campo en el objeto de dominio. Con Mysql se usa "SELECT LAST_INSERT_ID()" (Ver [enlace] (http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html) –

1

This sección de la documentación de Hibernate describe la generación automática de identificadores. Por lo general, la estrategia de generación automático se utiliza para la máxima portabilidad y suponiendo que se utiliza anotaciones para proporcionar los metadatos de dominio se puede configurar de la siguiente manera:

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private long id; 

De todos modos el enlace suministrado debe proporcionar todos los detalles que necesita en los identificadores generados.

+0

Genial, pero mi pregunta era decir que es una columna de Identidad cuyo siguiente valor es completamente decidido por el DB, ¿Cómo hibernate sabe que la fila que actualiza tiene un valor de clave principal x. Editado mi pregunta – vinothkr

+0

No estoy seguro de a qué se refiere, pero el valor del identificador se comunicará de nuevo porque se establecerá en la instancia de dominio que ha insertado. –

+1

También el valor que la base de datos usa para el ID depende del tipo de base de datos. Oracle usará SEQUENCE, MySQL, un valor de incremento automático, etc. –

0

Cuando crea un objeto con, por ejemplo, clave primaria sustituta derivada de secuencia, lo pasa a la sesión de Hibernate con ese campo establecido en el valor que Hibernate interpreta como "no asignado", por defecto 0. Este campo no se rellena con el valor asignado hasta que el registro correspondiente no se inserte en la tabla de la base de datos. Puede desencadenar la inserción llamando explícitamente a flush() en la sesión de hibernación o realizando una lectura de base de datos en la misma sesión. Después de eso, puede verificar el valor de ese campo y se le asignará en lugar de 0.

Cuestiones relacionadas