Tipo de recuperación predeterminado para uno a uno, muchos a uno y uno a muchos en Hibernate

103

¿Cuál es el tipo de recuperación predeterminado en las asignaciones de hibernación?

Lo que llegué a saber después de explorar es:

  • para uno a uno está ansioso .
  • para uno a muchos es vago .

Pero después de probarlo en Eclipse, estaba ansioso por todos.

¿Depende de si estoy usando JPA o Hibernate?

Richa
fuente
1
En caso de que todavía esté involucrado en temas de JPA, actualicé su pregunta con una nueva respuesta, ya que las antiguas están desactualizadas para la versión actual de Hibernate.
Alexander Rühl

Respuestas:

193

Depende de si está utilizando JPA o Hibernate.

De la especificación JPA 2.0 , los valores predeterminados son:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

Y en hibernación, todo es perezoso

ACTUALIZAR:

La última versión de Hibernate se alinea con los valores predeterminados de JPA anteriores.

Ashish Agarwal
fuente
11
"Y en hibernación, todo es perezoso" aparentemente ha cambiado en las últimas versiones. Consulte la respuesta de Alexander Rühl a continuación .
Dinei
1
Hibernate es una de las implementaciones de JPA, por lo que una vez que esté usando Hibernate,
estará
Esta es una consulta popular. @Ashish Agarwal ¿Puede actualizar la última línea de su respuesta? En Hibernate no es Lazy para todos ahora.
Saurabh Tiwari
Se actualizó la publicación con respecto al último comportamiento de Hibernate.
M Anouti
Hubo una actualización, afirmando que ansioso es el tipo de búsqueda predeterminado para cada mapeo, que se reconstruye en el capítulo 11.3 en la documentación actual de Hibernate 5.xy la nueva 6.x, así que deshice la edición. Además, va en contra de la recomendación de no tener avidez automático, ya que esto significaría probablemente seleccionar toda la base de datos al buscar un solo objeto.
Alexander Rühl
51

Sé que las respuestas eran correctas en el momento de hacer la pregunta, pero dado que las personas (como yo en este momento) todavía se preguntan por qué su WildFly 10 se comporta de manera diferente, me gustaría dar una actualización para el Hibernate 5 actual. .x versión:

En la Guía del usuario de Hibernate 5.2 , se indica en el capítulo 11.2. Aplicar estrategias de recuperación :

La recomendación de Hibernate es marcar estáticamente todas las asociaciones como perezosas y usar estrategias de búsqueda dinámica para el entusiasmo. Desafortunadamente, esto está en desacuerdo con la especificación JPA que define que todas las asociaciones uno a uno y muchos a uno deben buscarse ansiosamente por defecto . Hibernate, como proveedor de JPA, respeta ese valor predeterminado.

Entonces, Hibernate también se comporta como Ashish Agarwal mencionado anteriormente para JPA:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

(consulte la especificación JPA 2.1 )

Alexander Rühl
fuente
¿Y si usamos la hibernación nativa en lugar de la implícita de JPA, actúa de la misma manera?
jMounir
@jMounir: Bueno, no lo he intentado, pero dado que Hibernate afirma que se comporta como se define en JPA, no veo por qué eso difiera cuando se usa Hibernate por sí mismo. En ambos casos, se puede anular la estrategia predeterminada.
Alexander Rühl
15

Para responder a su pregunta, Hibernate es una implementación del estándar JPA. Hibernate tiene sus propias peculiaridades de funcionamiento, pero según los documentos de Hibernate

De forma predeterminada, Hibernate usa la búsqueda de selección diferida para colecciones y la búsqueda de proxy diferida para asociaciones de un solo valor. Estos valores predeterminados tienen sentido para la mayoría de las asociaciones en la mayoría de las aplicaciones.

Entonces, Hibernate siempre cargará cualquier objeto usando una estrategia de búsqueda perezosa, sin importar qué tipo de relación haya declarado. Utilizará un proxy perezoso (que debe estar sin inicializar pero no nulo) para un solo objeto en una relación uno a uno o muchos a uno, y una colección nula que hidratará con valores cuando intente acceder a él .

Debe entenderse que Hibernate solo intentará llenar estos objetos con valores cuando intente acceder al objeto, a menos que usted especifique fetchType.EAGER.

JamesENL
fuente
0

Para asociaciones de valor único, es decir, uno a uno y muchos a uno: -
Lazy predeterminada = proxy
Carga diferida de proxy : - Esto implica que se carga un objeto proxy de su entidad asociada. Esto significa que solo se carga la identificación que conecta las dos entidades para el objeto proxy de la entidad asociada.
Por ejemplo: A y B son dos entidades con asociación de Muchos a uno. es decir: puede haber múltiples A para cada B. Cada objeto de A contendrá una referencia de B.
`

public class A{
    int aid;
    //some other A parameters;
    B b;
}
public class B{
    int bid;
     //some other B parameters;
}

`
La relación A contendrá columnas (ayuda, oferta, ... otras columnas de la entidad A).
La relación B contendrá columnas (oferta, ... otras columnas de la entidad B). El

proxy implica que cuando se busca A, solo se busca el id para B y se almacena en un objeto proxy de B que contiene solo id. El objeto proxy de B es un objeto de una clase proxy que es una subclase de B con solo campos mínimos. Dado que la oferta ya es parte de la relación A, no es necesario disparar una consulta para obtener una oferta de la relación B. Otros atributos de la entidad B se cargan de forma perezosa solo cuando se accede a un campo que no sea la oferta.

Para colecciones, ie-Many-to-Many y One-to-Many: -
Default Lazy = true


Tenga en cuenta también que la estrategia de búsqueda (seleccionar, unir, etc.) puede anular lazy. es decir: si lazy = 'true' y fetch = 'join', la búsqueda de A también traerá B o Bs (en el caso de colecciones). Puede obtener la razón si lo piensa.
La recuperación predeterminada para la asociación de un solo valor es "unirse".
La recuperación predeterminada para las colecciones es "seleccionar". Verifique las dos últimas líneas. Lo he deducido lógicamente.

Jijo Mathew
fuente