web-dev-qa-db-fra.com

Type de recherche par défaut pour un à un, plusieurs à un et un à plusieurs dans Hibernate

Quel est le type de recherche par défaut dans les mappages hibernation?

Ce que j'ai appris après avoir exploré, c'est:

  • pour un-à-un c'est désireux .
  • pour un à plusieurs c'est paresseux .

Mais après l'avoir testé dans Eclipse, il était impatient de tous.

Est-ce que cela dépend si j'utilise JPA ou Hibernate?

75
Richa

Cela dépend si vous utilisez JPA ou Hibernate.

Dans la spécification JPA 2.0 , les valeurs par défaut sont les suivantes:

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

Et en hibernation, tout est paresseux

METTRE À JOUR:

La dernière version d'Hibernate s'aligne sur les valeurs par défaut JPA ci-dessus.

132
Ashish Agarwal

Je sais que les réponses étaient correctes au moment de poser la question - mais étant donné que des personnes (comme moi à présent) se retrouvent encore souvent en se demandant pourquoi leur WildFly 10 se comportait différemment, j'aimerais faire le point sur l'actuel Hibernate 5. version .x:

Dans le Guide de l'utilisateur Hibernate 5.2 , cela est indiqué au chapitre 11.2. Appliquer des stratégies de récupération:

La recommandation d'Hibernate est de marquer statiquement toutes les associations paresseux et utiliser des stratégies de récupération dynamiques pour l’empressement. C'est malheureusement en contradiction avec la spécification JPA qui définit cela _ {toutes les associations un-à-un et plusieurs-à-un doivent être recherchées avec impatience par défaut}. Hibernate, en tant que fournisseur JPA, respecte ce défaut.

Hibernate se comporte donc comme Ashish Agarwal a déclaré plus haut pour JPA:

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

(voir JPA 2.1 Spec )

46
Alexander Rühl

Pour répondre à votre question, Hibernate est une implémentation de la norme JPA. Hibernate a ses propres bizarreries d’opération, mais selon les la documentation d'Hibernate

Par défaut, Hibernate utilise l'extraction sélective paresseuse pour les collections et l'extraction proxy paresseuse pour les associations à valeur unique. Ces valeurs par défaut ont un sens pour la plupart des associations dans la majorité des applications.

Ainsi, Hibernate chargera toujours tous les objets en utilisant une stratégie d’extraction paresseuse, quel que soit le type de relation que vous avez déclaré. Il utilisera un proxy lazy (qui devrait être non initialisé mais non nul) pour un objet unique dans une relation un à un ou plusieurs-à-un, et une collection null qu'il hydratera avec des valeurs lorsque vous tenterez d'y accéder. . 

Il faut comprendre qu'Hibernate ne tentera de remplir ces objets avec des valeurs que lorsque vous tenterez d'accéder à l'objet, à moins que vous ne spécifiiez fetchType.EAGER.

15
JamesENL

Pour les associations à valeur unique, c'est-à-dire un à un et plusieurs à un: -
Par défaut Lazy = proxy
Chargement par proxy de proxy : - Ceci implique qu'un objet proxy de votre entité associée est chargé. Cela signifie que seul l'identifiant reliant les deux entités est chargé pour l'objet proxy de l'entité associée .
Ex: A et B sont deux entités avec plusieurs à une association. C'est-à-dire qu'il peut y avoir plusieurs A pour chaque B. Chaque objet de A contiendra une référence de B.
`

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

`
La relation A contiendra des colonnes (aide, offre, ... autres colonnes de l'entité A).
La relation B contiendra des colonnes (enchère, ... autres colonnes de l'entité B)

Proxy implique que lorsque A est récupéré, seul id est extrait pour B et stocké dans un objet proxy de B qui contient uniquement id B avec uniquement des champs minimaux . Étant donné que l'enchère fait déjà partie de la relation A, il n'est pas nécessaire de lancer une requête pour obtenir l'enchère de la relation B . que l'offre est accessible.

Pour les collections, c'est-à-dire plusieurs à plusieurs et un à plusieurs: -
Par défaut Lazy = true


Notez également que la stratégie d’extraction (select, join, etc.) peut remplacer lazy . Par exemple, si lazy = 'true' et fetch = 'join', la récupération de A cherchera également B ou Bs des collections). Vous pouvez avoir la raison si vous y réfléchissez .
L'extraction par défaut pour une association à valeur unique est "rejoindre" .
L'extraction par défaut pour les collections est "select" . Veuillez vérifier les deux dernières lignes. J'ai déduit cela logiquement.

0
Jijo Mathew