2013-04-22 13 views

risposta

8

Si consiglia di creare un nuovo EntityManager per transazione. Questo è il modo in cui è stato progettato JPA. EntityManager non deve essere un oggetto costoso da creare. (Tuttavia, EntityManagerFactory è molto costoso, quindi assicurati di averne solo uno).

+1

Quando si utilizza il primo approccio, a volte EntityManager non è in 'sync' perché 'ThreadLocal' genera il nuovo EntityManager per ogni thread. Sono partito con una sola scelta: creare un nuovo EntityManager per transazione. – user2198754

+1

James Sutherland consiglia di riutilizzare EntityManager durante la richiesta. Il motivo principale è la condivisione del contesto di persistenza. Sei d'accordo? http://www.coderanch.com/t/550734/ORM/databases/Practise-EntityManager – okwap

0

Il collegamento fornito da okwap è molto utile. Per assicurarsi che non scivolare attraverso, e di seguire le regole di bordo, ho messo una copia qui:

 
- an EntityManager contains a persistence context, that will track 
    everything read through it, so to avoid bloated memory, you should 
    acquire a new one, or clear it at some point 
- if you read the same object through two different EntityManager you 
    will get different objects back, so will loose object identity, which 
    is something to consider 

Sulla base di ciò, vorrei aggiungere, che la lettura attraverso due differenti EntityManager può dare anche oggetti con contenuti diversi , se nel frattempo una transazione del database è stata eseguita da qualcun altro. Ma se si legge ripetutamente attraverso lo stesso gestore di entità, la seconda lettura otterrà l'oggetto dalla cache del gestore di entità, quindi lo stato più recente non sarà visibile.

Problemi correlati