¿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?
Respuestas:
Depende de si está utilizando JPA o Hibernate.
De la especificación JPA 2.0 , los valores predeterminados son:
Y en hibernación, todo es perezoso
ACTUALIZAR:
La última versión de Hibernate se alinea con los valores predeterminados de JPA anteriores.
fuente
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 :
Entonces, Hibernate también se comporta como Ashish Agarwal mencionado anteriormente para JPA:
(consulte la especificación JPA 2.1 )
fuente
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
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
.fuente
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.
`
`
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.
fuente