Différent entre session.get () et session.load ()

Différent entre session.get () et session.load ()

Souvent, vous remarquerez que les développeurs Hibernate mélangent l’utilisation desession.get() etsession load(), vous demandez-vous ce qui est différent et quand vous devriez l’utiliser?

Différent entre session.get () et session.load ()

En fait, les deux fonctions sont utilisées pour récupérer un objet avec un mécanisme différent, bien sûr.

1. session.load()

  • Il renverra toujours un «proxy» (terme Hibernate) sans toucher la base de données. Dans Hibernate, le proxy est un objet avec la valeur d'identifiant donnée, ses propriétés ne sont pas encore initialisées, il ressemble juste à un faux objet temporaire.

  • Si aucune ligne n'est trouvée, il lancera unObjectNotFoundException.

2. session.get()

  • Il a toujourshit the database et renvoie l'objet réel, un objet qui représente la ligne de la base de données, pas le proxy.

  • Si aucune ligne n'est trouvée, elle renvoienull.

C'est une question de performance

Hibernate crée quoi que ce soit pour certaines raisons, lorsque vous effectuez l'association, il est normal d'obtenir un objet (instance persistante) de la base de données et de l'assigner comme référence à un autre objet, juste pour maintenir la relation. Passons en revue quelques exemples pour comprendre dans quelle situation vous devez utilisersession.load().

1. session.get()

Par exemple, dans une application Stock, Stock et StockTransactions doivent avoir une relation «un-à-plusieurs», lorsque vous souhaitez enregistrer une transaction boursière, il est courant de déclarer quelque chose comme ci-dessous

           Stock stock = (Stock)session.get(Stock.class, new Integer(2));
           StockTransaction stockTransactions = new StockTransaction();
           //set stockTransactions detail
           stockTransactions.setStock(stock);
           session.save(stockTransactions);

Sortie

Hibernate:
    select ... from example.stock stock0_
    where stock0_.STOCK_ID=?
Hibernate:
    insert into example.stock_transaction (...)
    values (?, ?, ?, ?, ?, ?)

Dans session.get (), Hibernate frappera la base de données pour récupérer l'objet Stock et le placera comme référence à StockTransaction. Cependant, ce processus de sauvegarde est extrêmement demandé, il peut y avoir des milliers ou des millions de transactions par heure, pensez-vous que cela soit nécessaire pour accéder à la base de données pour récupérer l'objet Stock tout enregistrer un enregistrement de transaction stock? Après tout, vous avez juste besoin de l'ID du stock comme référence à StockTransaction.

2. session.load()

Dans le scénario ci-dessus,session.load() sera votre bonne solution, voyons l'exemple,

           Stock stock = (Stock)session.load(Stock.class, new Integer(2));
           StockTransaction stockTransactions = new StockTransaction();
           //set stockTransactions detail
           stockTransactions.setStock(stock);
           session.save(stockTransactions);

Sortie

Hibernate:
    insert into example.stock_transaction (...)
    values (?, ?, ?, ?, ?, ?)

Dans session.load (), Hibernate n'atteindra pas la base de données (aucune instruction select en sortie) pour récupérer l'objet Stock, il renverra un objet proxy Stock - un faux objet avec une valeur d'identification donnée. Dans ce scénario, un objet proxy suffit pour enregistrer un enregistrement de transaction de stock.

Exception

En cas d'exception, voir les exemples

session.load()

Stock stock = (Stock)session.load(Stock.class, new Integer(100)); //proxy

 //initialize proxy, no row for id 100, throw ObjectNotFoundException
System.out.println(stock.getStockCode());

Il retournera toujours un objet proxy avec la valeur d'identité donnée, même la valeur d'identité n'existe pas dans la base de données. Cependant, lorsque vous essayez d'initialiser un proxy en récupérant ses propriétés dans la base de données, il frappera la base de données avec l'instruction select. Si aucune ligne n'est trouvée, unObjectNotFoundException sera lancé.

org.hibernate.ObjectNotFoundException: No row with the given identifier exists:
[com.example.common.Stock#100]

session.get()

//return null if not found
Stock stock = (Stock)session.get(Stock.class, new Integer(100));
System.out.println(stock.getStockCode()); //java.lang.NullPointerException

Il retournera toujours null si la valeur d'identité n'est pas trouvée dans la base de données.

Conclusion

Il n'y a pas toujours de solution correcte, vous devez comprendre la différence entre les deux et décider quelle méthode convient le mieux à votre application.