English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

浅谈解决Hibernate懒加载的4种方式

Questo articolo riassume i quattro modi che ho utilizzato per risolvere il problema del caricamento lazy in Hibernate durante il mio studio.

Il caricamento lazy (lazy) è un caricamento differito, un caricamento ritardato.

Quando utilizzare il caricamento lazy? Solo posso rispondere che si utilizza il caricamento lazy quando è necessario.

Perché utilizzare il caricamento lazy? È perché quando la quantità di dati da accedere è troppo grande, l'uso della cache non è molto adatto, poiché la capacità di memoria è limitata. Per ridurre il numero di accessi concorrenti e ridurre il consumo di risorse del sistema, carichiamo i dati solo quando necessario, e in questo caso utilizziamo il caricamento lazy.

Ad esempio, c'è un oggetto chiamato Employee e un altro oggetto chiamato Department. È ovvio che, rispetto al Department, l'Employee ha una relazione molti-a-uno; mentre, rispetto all'Employee, il Department ha una relazione uno-a-molti. Quando si consulta l'oggetto Employee, se si desidera utilizzare l'attributo department dell'oggetto employee per ottenere il corrispondente Department, si verificherà un'eccezione. Questo è dovuto alla presenza del caricamento lazy, dopo la chiusura della sessione, Hibernate invia una nuova richiesta al database, il che provoca l'eccezione.

The following summarizes four ways to solve this problem:

1. Explicit initialization (within the query method)

When querying which department an employee belongs to, you need to pre-query Department

Use the statement

Hibernate.initialize(Department.class); 

2. Modify the object relationship file, rewrite lazy to lazy=false, that is, turn off lazy loading

Both of these methods can indeed solve the problem, but the disadvantage is that hibernate will send SQL statements to the database to request data regardless of whether the object is used later, causing unnecessary performance waste.

3. Use a filter (web project)

① The method of obtaining the session must use getCurrentSession

② Special session closing method

public void doFilter(ServletRequest request, ServletResponse response, 
   FilterChain arg2) throws IOException, ServletException { 
  // TODO Auto-generated method stub 
  Session session = null; 
  Transaction tx = null; 
  try { 
   session = HibernateUtil.getCurrentSession(); 
   tx = session.beginTransaction(); 
   arg2.doFilter(request, response);// The request keeps going 
   tx.commit(); 
  } catch (Exception e) { 
   // TODO: handle exception 
   if(tx != null){ 
    tx.rollback(); 
   } 
  }finally{ 
   // Special closing method 
   HibernateUtil.closeCurrentSession(); 
  } 
 } 

4. In the SSH framework, use the openSessionView provided by spring

Il principio è simile al metodo del punto 3 utilizzando il Filter, ma questo filter è fornito da Spring. Durante l'uso, è sufficiente configurare come segue nel file web.xml:

<!-- Risolvere il problema di lazy loading utilizzando Spring --> 
 <filter> 
  <filter-name>OpenSessionInViewFilter</filter-name> 
  <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> 
 </filter> 
 <filter-mapping> 
  <filter-name>OpenSessionInViewFilter</filter-name> 
  <url-pattern>/*</url-pattern> 
 </filter-mapping> 

I metodi del punto 3 e 4 possono anche risolvere il problema di lazy loading, tra cui il metodo del punto 4 è anche molto utilizzato in questo momento. Tuttavia, entrambi i metodi hanno anche svantaggi, ovvero prolungano il tempo di chiusura della sessione, aumentando la durata del ciclo di vita della sessione. Prima di utilizzare questo metodo, la sessione veniva chiusa dopo la query dei dati; ora, la chiusura della sessione avviene solo alla fine di una richiesta web.

Sommario

Questo è tutto il contenuto dell'articolo che spiega i 4 modi per risolvere il problema di lazy loading di Hibernate, spero sia utile a tutti. Chi è interessato può continuare a consultare altre sezioni correlate di questo sito, e se c'è qualcosa di insufficiente, è sempre bene lasciare un commento. Grazie per il supporto degli amici di questo sito!

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright spetta agli autori originali, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato editato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.