web-dev-qa-db-fra.com

Quelle est la différence entre EntityManager.find () et EntityManager.getReference ()?

Quelle est la différence entre

<T> T EntityManager.find(Class<T> entityClass, Object primaryKey) and 
<T> T EntityManager.getReference(Class<T> entityClass, Object primaryKey) 

?

Je pense que getReference renvoie l'entité si elle est gérée. et find renvoie l'entité si elle est gérée sinon exécute SQL sur la base de données pour la gérer.

Veuillez confirmer.


Contexte: De la webapp j'obtiens la clé primaire de l'objet à supprimer (pk de type long); à l'entité doit être gérée pour être supprimée.

EntityManager.remove(Object entity)

passer l'entité gérée à la méthode de suppression de l'entité manager 'quelle est la meilleure option et la bonne? find or getReference? '

45
user237673

JPA a le concept d'un EntityManager, comme vous le savez. Pendant votre travail dans le gestionnaire d'entités, certains objets sont chargés à partir de la base de données, peuvent être modifiés et ensuite vidés dans la base de données.

find() doit renvoyer une instance initialisée de votre objet. S'il n'est pas déjà chargé dans EntityManager, il est récupéré de la base de données.

getReference() est autorisé à renvoyer un proxy au lieu d'une instance initialisée, si l'entité n'a pas été chargée dans EntityManager auparavant. Dans ce proxy, seul l'attribut de clé primaire est initialisé. Les proxys peuvent être créés sans toucher la base de données, car le seul attribut initialisé est déjà donné à la fonction getReference ().

Ce dernier est utile lorsque vous avez une entité A référençant une entité B et que vous souhaitez définir l'attribut b de A sur B, sans avoir à charger B à partir de la base de données.

Ce n'est que si vous faites référence à d'autres attributs de B que le proxy sera initialisé.

72
Daniel

getReference() ne récupère pas l'objet complet mais uniquement un proxy et peut donc être plus efficace si vous n'accédez pas aux membres de l'objet.

Par exemple, lors de la création d'un nouvel objet à insérer dans votre base de données, il peut être nécessaire de se référer à un autre objet qui a déjà été stocké dans la base de données.

Pour que JPA stocke correctement le nouvel objet, seule la clé primaire de l'objet référencé est nécessaire. En utilisant getReference() vous obtenez un proxy qui contient la clé primaire et vous économisez le coût de chargement de l'objet complet.

8
Eelke

Le livre Beginning Java EE 6 Platform with GlassFish , mentionnez les différences de la page 135: "Recherche par ID"

find() si l'entité est trouvée, elle est retournée; s'il n'est pas trouvé, une valeur nulle est retournée.

MyEntity obj = em.find(MyEntity.class, id);
if(obj != null){
   // Process the object 
}

getReference() est destiné aux situations dans lesquelles une instance d'entité gérée est nécessaire, mais aucune donnée, autre que potentiellement la clé primaire de l'entité, n'est accessible.

try {
    MyEntity obj = em.getReference(MyEntity.class, id);
    // Process the object
} catch (EntityNotFoundException e) {
    // Entity Not Found
}
7
Jaider